【问题标题】:Retrieving Document Id from Firestore Collection (Android)从 Firestore 集合中检索文档 ID (Android)
【发布时间】:2018-10-17 17:49:42
【问题描述】:

我正在尝试提取文档下的自动生成的 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) {

                    String chatId = mWhammyUsersCollection.document(mCurrentUserId)
                            .collection("my-chats").document().getId();

                    Log.v("CHATS", chatId);

                    myChatFields.put("chatCardId", chatId);

                    Intent goToChatActivity = new Intent(UserProfileActivity.this,
                            ChatActivity.class);
                    startActivity(goToChatActivity);

                }
            });

如您所见,我正在使用下面显示的代码生成一个名为“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(我猜这是因为我之前使用过 .document() 方法.getId() 方法)。

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

我该如何解决这两个问题?

更形象地解释它:

Picture of database

我正在尝试检索“1”并将其添加到“2”区域。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

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

    不,这是因为您两次调用 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 的引用将解决您的问题。

    【讨论】:

      【解决方案2】:

      对于第一部分,您需要在 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);
      
                  }
              });
      

      【讨论】:

      • 我试过了,但它说“在任务中无法应用”
      • 错过了 set 与 add 的使用。我已经在上面进行了调整。 (虽然,我确实认为它们应该是等价的。)
      • 好的,所以您的更正使 addOnSuccessListener 工作,但现在根本没有在数据库中创建集合“my-chats”,因此日志也没有显示任何内容。
      【解决方案3】:

      Documentation写道

      但是,有时此文档没有有意义的 ID,让 Cloud Firestore 自动为您生成 ID 会更容易。你可以通过调用add().来做到这一点

      所以你可以关注@R。赖特的回答。

      【讨论】:

        【解决方案4】:

        您可以从收集数据中获取您的 id 作为 QuerySnapshot。只需存储位置/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());
                    }
        
                }
            });
        

        【讨论】:

        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        相关资源
        最近更新 更多