如何从Firestore数据库获取文档ID

时间:2019-07-17 03:52:31

标签: java android firebase google-cloud-firestore

我正在尝试通过调用doc.getId()来检索文档ID,但是无法从此代码中调用它

        db.collection("Pegawai").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if(e != null) {
                    Log.d(TAG, e.toString());
                }
                if (queryDocumentSnapshots != null) {
                    for (DocumentChange doc: queryDocumentSnapshots.getDocumentChanges()) {
                        if (doc.getType() == DocumentChange.Type.ADDED) {
                            Pegawai pegawai = doc.getDocument().toObject(Pegawai.class);
                            pegawai.setId(doc.getId());
                            pegawaiList.add(pegawai);

                            pegawaiListAdapter.notifyDataSetChanged();
                        }
                    }
                }
            }
        });

我已经尝试过此代码,并且显然可以用此代码调用doc.getId(),但是此代码根本没有填充我的recyclerview

        db.collection("Pegawai").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if(e != null) {
                    Log.d(TAG, e.toString());
                }
                if (queryDocumentSnapshots != null) {
                    for (DocumentSnapshot doc : queryDocumentSnapshots) {
                        Pegawai pegawai = doc.toObject(Pegawai.class);
                        pegawai.setId(doc.getId());
                        pegawaiList.add(pegawai);
                    }
                }
            }
        });

3 个答案:

答案 0 :(得分:1)

DocumentChange对象具有方法getDocument(),该方法返回一个QueryDocumentSnapshot对象。这是DocumentSnapshot的子类,这意味着它还有一个getId()方法。因此,您应该能够使用doc.getDocument().getId()来获取正在处理的文档的ID。

答案 1 :(得分:0)

以下是如何用Javascript解决它,也许这将帮助您将其转换为Java。 使用以下方法,我们可以动态地检索文档ID。请注意,我们使用snapshotChanges()。这很重要,因为一旦我们订阅了此功能,订阅中包含的就是文档ID。

saveMyValuesHere: any[] = []

getPegawai() {

    return this.db.collection('Pegawai').snapshotChanges();

  }

 getPegawai().subscribe(serverItems => {
      this.saveMyValuesHere = [];
      serverItems.forEach(a => {
        const data = a.payload.doc.data();
        const id = a.payload.doc.id;
        this.saveMyValuesHere.push({ id, ...data});
      });
    });

答案 2 :(得分:0)

如果您将FirestoreRecyclerAdapter与Recyclerview一起使用,请执行此操作。

 DocumentSnapshot snapshot = options.getSnapshots().getSnapshot(position);
            String dbKey = snapshot.getId();
            Log.d(TAG, "The database Key is : "+ dbKey);

然后您可以像这样将其绑定到视图持有器上

    holder.setDocumentId(dbKey);

然后,您可以在任何地方检索它,具体取决于您的获取器和设置器。我希望这会对外面的人有所帮助。