【发布时间】:2018-10-04 01:25:30
【问题描述】:
我正在尝试检查 firestore 中的文档是否存在。我从 Firestore 控制台复制了文档 (col3) 的确切位置,因此它必须更正。
尽管文档保存在数据库中,但 document.exists() 返回 false。我从 this 站点遵循了 Google 指南。
我已经设置了断点并检查了 DocumentSnapshot 对象,但是很难遵循例如 zza、zzb、zzc...
private fun nameExists(userId: String, colName: String): Boolean{
val nameExists = booleanArrayOf(false)
val docRefA = fbDb!!.document("users/X9ogJzjJyOgGBV0kmzk7brcQXhz1/finalGrades/col3")
val docRefB = fbDb!!.collection("users")
.document(userId)
.collection("finalGrades")
.document(colName)
docRefA.get().addOnCompleteListener { task ->
if (task.isSuccessful) {
val document = task.result
if (document.exists()) {
nameExists[0] = true
}else{
Log.d(TAG, "no such document")
}
} else {
Log.d(TAG, "get failed with ", task.exception)
}
}
return nameExists[0]
}
【问题讨论】:
-
您能否显示 Firebase 控制台的屏幕截图以及您尝试加载的文档及其竞争路径?
-
@Frank van Puffelen - 澄清一下,我正在尝试获取文档,而不是加载。但是,我不关心 document.getData();我只对从 document.exists() 返回布尔值感兴趣;通知用户他们应该以不同的名称保存新文档。 screenshot 来自 Firestore。
-
调用
get()加载文档数据。 -
Logcat 条目表明获取 DocumentReference 的操作是异步运行的,因此尽管在闭包中捕获了 nameExists[0] 中的值,但它在由 nameExists 返回后更新方法。 10-12 00:02:09.190 20519-20519/com.proto.patryk.ou_gradecalculator D/ModulesFragment:返回值 false ... 10-12 00:02:11.715 20519-20519/com. proto.patryk.ou_gradecalculator D/ModulesFragment:name 设置为 true 是否可以从 lambda 函数返回布尔值?
-
哦,对不起,我完全错过了。
return nameExists[0]确实没有办法工作,因为回调 black 还没有运行。这正是get()使用完成侦听器本身来表示数据可用的原因。如果您需要确保有数据,您还需要传入一个完成侦听器(请参阅 here 了解另一个 Firebase 数据库,但问题和解决方案相同),或者您自己返回一个Task。
标签: android firebase google-cloud-firestore