我正在使用Kotlin开发一个android应用,并且我试图从Firestore获取文档参考

时间:2019-10-31 10:14:36

标签: android firebase kotlin google-cloud-firestore

我正在用Kotlin和Firebase开发一个android本机应用程序,我有一个名为Topic的集合和2个类型为引用的字段,一个是User,另一个是Category,我试图同时使用参考文档获取所有文档,但是它似乎不起作用:

db.collection("topic").get().addOnSuccessListener { result ->
        for (document in result) {
            Log.e("success", "${document.id} => ${document.data.get("subject")}")
            var topic: Topic = Topic(
                document.id as String,
                document.data.get("subject") as String,
                document.data.get("content") as String,
                document.data.get("created_at") as String,
                document.getDocumentReference("Category") as Category,
                document.getDocumentReference("User") as User
            )}

没有错误,但是在我的print(topic)中也没有结果。

这是主题课程

class Topic : Serializable {
    var id : String = ""
    var subject : String = ""
    var content : String = ""
    var created_at : String = ""
    var cat = Category()
    var user = User()

    constructor(){}

    constructor(
        id: String,
        subject: String,
        content: String,
        created_at: String,
        cat: Category,
        user: User
    ) {
        this.id = id
        this.subject = subject
        this.content = content
        this.created_at = created_at
        this.cat = cat
        this.user = user
    }

    override fun toString(): String {
        return "Topic(id='$id', subject='$subject', content='$content', created_at='$created_at', cat=$cat, user=$user)"
    }
}

Database

2 个答案:

答案 0 :(得分:1)

您必须通过单独的get()调用来显式地获取每个引用的文档。无法在当前通话中自动获取它们。

类似这样:

db.collection("topic").get().addOnSuccessListener { result ->
    for (document in result) {
        document.getDocumentReference("Category").get().addOnSuccessListener { categoryDoc ->
            let category = categoryDoc.data as Category
            ...
        }
    }
}

另请参阅:

答案 1 :(得分:1)

使用以下代码行时:

result

您将获得[类型的对象,而不是类型为document.getDocumentReference("Category") as Category 的对象,因为DocumentSnapshot的getDocumentReference()方法返回了该类型的对象。请记住,在Kotlin中,您无法将类型DocumentReference的对象强制转换为Category,因此存在这种行为。

因此,仅获取对对象的引用将返回对象本身的假设是不正确的。解决此问题的唯一方法是分别呼叫每个呼叫,如@FrankvanPuffelen在其回答中所述。

作为一个单独的主题,您还可以查看下面的帖子,因为我看到您对文档中的属性使用了不同的命名方式: