我正在用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)"
}
}
答案 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在其回答中所述。
作为一个单独的主题,您还可以查看下面的帖子,因为我看到您对文档中的属性使用了不同的命名方式: