firebase 如何将文档快照的元素存储为列表中的对象,并在firestore数据库上的事务中检索它们的文档id

juzqafwq  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(115)

我创建了一个Firestore数据库,其中包含名为“Courses”的用户定义类的对象作为其文档。现在,我想在事务中读取这些文档及其文档ID的列表。我可以将这些文档存储在一个列表中,但我不知道如何检索这些文档的文档ID。据我所知,在Firestore数据库上操作的事务在使用get方法读取该数据库时返回文档快照。我想从这个文档快照中提取这些文档的文档ID,但我不知道如何做到这一点。
下面是我的数据库的图片。
enter image description here
下面是我的用户定义类“课程”的android studio java代码。

import com.google.firebase.firestore.Exclude;
 
import java.io.Serializable;
 

public class Courses implements Serializable {
 
    
    public String getId() {
        return id;
    }
 
    
    public void setId(String id) {
        this.id = id;
    }
 
    
    @Exclude
    private String id;
     
   
    private String courseName, courseDescription, courseDuration;
 
    public Courses() {
       
    }
 
    .
    public Courses(String courseName, String courseDescription, String courseDuration) {
        this.courseName = courseName;
        this.courseDescription = courseDescription;
        this.courseDuration = courseDuration;
    }
 
    
    public String getCourseName() {
        return courseName;
    }
 
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
 
    public String getCourseDescription() {
        return courseDescription;
    }
 
    
    public void setCourseDescription(String courseDescription) {
        this.courseDescription = courseDescription;
    }
 
    public String getCourseDuration() {
        return courseDuration;
    }
 
    public void setCourseDuration(String courseDuration) {
        this.courseDuration = courseDuration;
    }
}

我尝试用java编写以下代码,以列表的形式存储firestore数据库中的文档:
documentSnapshot doclist.get(document1); List courses1 = doclist.toObject(Courses.class);
但是我不知道如何从上面的“courses 1”列表中获取文档ID。

nx7onnlm

nx7onnlm1#

您可以使用document.getId()获取文档ID。您必须遍历查询中的每个文档,获取其文档ID并将其保存回courses数据对象中。在firebase docs上阅读更多。

db.collection("collection-name")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        // map the document to the data class
                        Courses courses = document.toObject(Courses.class);
                        // add document Id to each object
                        courses.setId(document.getId());
                        // add each course to the list
                        coursesList.add(courses);

                        Log.d(TAG, document.getId() + " => " + document.getData());
                    }
                } else {
                    Log.d(TAG, "Error getting documents: ", task.getException());
                }
            }
        });
nhaq1z21

nhaq1z212#

只能在FirebaseFirestore对象上运行事务。因为你没有分享你的代码,我想它看起来像这样:

DocumentReference docIdRef = db.collection("Courses").document("usk...O18");
db.runTransaction(new Transaction.Function<Void>() {
    @Override
    public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {
        DocumentSnapshot snapshot = transaction.get(docIdRef);

        String docId = snapshot.getId();
        transaction.update(docIdRef, "id", docId);

        return null;
    }
}).addOnSuccessListener(new OnSuccessListener<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
        Log.d(TAG, "Transaction success!");
    }
})
.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Log.w(TAG, "Transaction failure.", e);
    }
});

上面的代码将读取事务中的“usk.O18”文档,它将读取事务中的文档ID,并将更新id字段的值。我不确定为什么需要文档ID,因为您已经知道该ID,因为在创建指向该文档的引用时会使用它。

相关问题