从 Firestore Collection (Android) 中检索文档 ID



我正在尝试提取文档下的自动生成的 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(我猜这是因为我在.getId((方法之前使用.document((方法(。

2(由于某种原因,信息不会通过我输入的最后一行代码添加到HashMap中。

如何解决这两个问题?

为了更形象地解释它:

数据库图片

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

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的引用将解决您的问题。

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

在文档中写道

但是,有时此文档没有有意义的 ID,让 Cloud Firestore 为您自动生成 ID 会更容易。您可以通过调用add().来执行此操作

所以你可以按照@R赖特的回答。

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

最新更新