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

时间:2018-10-17 17:49:42

标签: java android firebase google-cloud-firestore

我正在尝试提取文档下的自动生成的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”区域。

4 个答案:

答案 0 :(得分:0)

对于第一部分,您将希望在onSuccess函数vs. 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);

            }
        });

答案 1 :(得分:0)

  

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 :(得分:0)

Documentation中写道

  

但是,有时此文档没有有意义的ID,让Cloud Firestore为您自动生成ID会更容易。您可以致电add().

因此您可以关注@R。赖特答案。

答案 3 :(得分:0)

您可以从集合数据中获取您的 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());
            }

        }
    });