为了账号安全,请及时绑定邮箱和手机立即绑定

从 Firestore 集合中检索文档 ID (Android)

从 Firestore 集合中检索文档 ID (Android)

繁花不似锦 2021-11-24 14:47:50
我正在尝试提取文档下自动生成的 ID,以便我可以在其他地方使用它。这是完整的代码:mStartChatButton.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {            final HashMap<String, Object> myChatFields = new HashMap<>();            myChatFields.put("dateJoined", ServerValue.TIMESTAMP );            myChatFields.put("status", "");            myChatFields.put("snoozeUntil", "");            myChatFields.put("myCharacter", "");            myChatFields.put("requestedCustomChatCode", "");            myChatFields.put("groupChatName", "");            myChatFields.put("toInviteMembers", "");            myChatFields.put("lastMessage", "");            myChatFields.put("lastMessageTimeStamp", ServerValue.TIMESTAMP);            mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")                    .document().set(myChatFields)                    .addOnSuccessListener(new OnSuccessListener<Void>() {                @Override                public void onSuccess(Void aVoid) {                }            });正如您所看到的,我正在使用下面显示的代码生成一个名为“my-chats”的集合,而 .document() 正在创建自动生成的文档 ID。mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")                    .document().set(myChatFields)                    .addOnSuccessListener(new OnSuccessListener<Void>() {然后我使用下面显示的代码行尝试从该文档中获取 id。String chatId = mWhammyUsersCollection.document(mCurrentUserId)                            .collection("my-chats").document().getId();最后使用下面的代码行,我试图将它放入我创建的 HashMap 中。myChatFields.put("chatCardId", chatId);我有两个主要问题:1)我用来提取文档 ID 的代码行不起作用,正在提取其他一些新的自动生成的 ID(我猜这是因为我在 .getId 之前使用了 .document() 方法() 方法)。2)由于某种原因,信息也没有通过我放置的最后一行代码添加到 HashMap 中。我该如何解决这两个问题?
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

1)我用来提取文档 ID 的代码行不起作用,正在提取其他一些新的自动生成的 ID(我猜这是因为我在 .getId 之前使用了 .document() 方法() 方法)。

不,这是因为您两次调用 CollectionReference 的document()方法:

返回一个 DocumentReference 指向一个文档,该文档具有此集合中自动生成的 ID。

因此,每次调用document()方法时,都会生成一个新的 id。要解决此问题,请更改以下代码行:

mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")
                .document().set(myChatFields)
                .addOnSuccessListener(/* ... */);

String id = mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")
                .document().getId();
                mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")
                .document(id).set(myChatFields)
                .addOnSuccessListener(/* ... */);

看,我在引用中使用了id第一次生成的。现在在onSuccess()方法内部,您应该使用id上面生成的相同内容:

myChatFields.put("chatCardId", id);

而不是更新的,就像您在实际代码中所做的那样。

2)由于某种原因,信息也没有通过我放置的最后一行代码添加到 HashMap 中。

这是因为您使用了错误的参考。使用包含正确的参考id将解决您的问题。


查看完整回答
反对 回复 2021-11-24
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

对于第一部分,您需要在 onSuccess 函数与 void 中获取文档引用。所以这看起来像这样 -


      mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats").add(myChatFields)

                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {

        @Override

        public void onSuccess(DocumentReference documentReference) { 



                String chatId = documentReference.getId();


                Log.v("CHATS", chatId);


                myChatFields.put("chatCardId", chatId);


                Intent goToChatActivity = new Intent(UserProfileActivity.this,

                        ChatActivity.class);

                startActivity(goToChatActivity);


            }

        });


查看完整回答
反对 回复 2021-11-24
?
www说

TA贡献1775条经验 获得超8个赞

您可以从集合数据中获取您的 id 作为 QuerySnapshot.Just 存储位置/id


    mFirebaseStore.collection("allorder").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {

        @Override

        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

            try {

                if (!queryDocumentSnapshots.isEmpty()) {

                    id = queryDocumentSnapshots.getDocuments().get(position).getId();

                    mArrayList.clear();

                    List<OrderDetails> data = queryDocumentSnapshots.toObjects(OrderDetails.class);

                    mArrayList.addAll(data);

                    mCustomerName.setText(mArrayList.get(position).getCustomerName());

                    mCustomerContact.setText(mArrayList.get(position).getContactNumber());

                    mCustomerLocation.setText(mArrayList.get(position).getArea().equals("") ? "No Location Found" : mArrayList.get(position).getArea());

                    mCustomerInstruction.setText(mArrayList.get(position).getSpecialInstruction().equals("") ? "Type Something" : mArrayList.get(position).getSpecialInstruction());

                    mTotalPrice.setText(mArrayList.get(position).getTotalPrice().equals("") ? "0" : mArrayList.get(position).getTotalPrice().toString());

                    String orderStatus = mArrayList.get(position).getOrderStatus();

                    if (orderStatus.equals("pending") || orderStatus.equals("rejected")) {

                        mLayout.setVisibility(View.VISIBLE);

                    } else if (orderStatus.equals("accepted")) {

                        mLayout.setVisibility(View.GONE);

                    }

                    JSONArray json = new JSONArray(mArrayList.get(position).getItemList());

                    List<AdminOrderDetailsModel> mList = new ArrayList<>();

                    for (int i = 0; i < json.length(); i++) {

                        JSONObject jsonObject = json.getJSONObject(i);

                        AdminOrderDetailsModel model = new AdminOrderDetailsModel();

                        model.setPackageName(jsonObject.getString("packageName"));

                        model.setPackageType(jsonObject.getString("packageType"));

                        model.setPrice(jsonObject.getString("price"));

                        model.setDuration(jsonObject.getString("duration"));

                        model.setQuantity(jsonObject.getInt("quantity"));

                        mList.add(model);

                    }

                    AdminOrderDetailsAdapter adapter = new AdminOrderDetailsAdapter(getApplicationContext(), mList);

                    setRecyclerLayoutManager(getApplicationContext(), mOrderListView, LinearLayoutManager.VERTICAL);

                    mOrderListView.setAdapter(adapter);


                }

            } catch (Exception ex) {

                System.out.println(ex.getMessage());

            }


        }

    });



查看完整回答
反对 回复 2021-11-24
  • 3 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信