提问人:Muhammed Ali ERKOÇ 提问时间:11/17/2023 最后编辑:Frank van PuffelenMuhammed Ali ERKOÇ 更新时间:11/18/2023 访问量:48
在 Kotlin 中从 firebase 检索数据时,列表返回空
When retrieving data from firebase in Kotlin, the list returns empty
问:
第一种情况:
第二种情况
我正在 Kotlin 中制作一个应用程序,我将我的数据保存在 firebase 中并从那里获取数据。我用来将数据保存到 firebase 的函数是代码博客中编写的函数。saveArea(1)
当我想检索我保存在这里的数据时,我使用我的函数,我可以检索我的数据。但是,我用来检索所有用户的所有数据的函数是 。函数运行后,将显示一个空列表。fetchData(2)
fetchArea(3)
当我在 Firestore 控制台中打开数据时,我看到一条消息(照片 1):
此文档不存在,它不会出现在查询或快照中
然后,我点击了“添加字段”的部分,添加了一些数据,然后删除了它,看到了照片 2 中的文字:
本文档没有数据。
完成此操作后,我的函数起作用了,我能够获取用户下的所有数据。fetchArea(3)
是我做错了查询,还是在保存数据时我的保存垫子错了?
class FireBaseSourceImpl @Inject constructor(private val database: FirebaseFirestore) : FireBaseSource {
override suspend fun saveArea(dataModel: DataModel): Result<Unit> {
return kotlin.runCatching {
val post = hashMapOf(
"message" to dataModel.message,
"title" to dataModel.title,
"photoUrl" to dataModel.photoUrl,
"timeStamp" to dataModel.timestamp
)
database.collection("Users").document(dataModel.currentUser)
.collection("construcitonName").document(dataModel.constructionArea).set(post)
.await()
}
}
override suspend fun fetchData(
currentUser: String, constructionName: String
): Result<List<DataModel>> {
return kotlin.runCatching {
val dataModelList = mutableListOf<DataModel>()
val documentSnapshot =
database.collection("Users").document(currentUser).collection("construcitonName")
.document(constructionName).get().await()
if (documentSnapshot.exists()) {
val data = documentSnapshot.data
val message = data?.get("message") as? String ?: ""
val title = data?.get("title") as? String ?: ""
val photoUrl = data?.get("photoUrl") as? String ?: ""
val timestamp = data?.get("timeStamp") as? Long ?: 0L
val retrievedDataModel = DataModel(
message, title, photoUrl, timestamp, currentUser, constructionName
)
dataModelList.add(retrievedDataModel)
}
dataModelList.toList()
}
}
override suspend fun fetchArea(): Result<List<ConstructionName>> {
return kotlin.runCatching {
val constructionNames = mutableListOf<ConstructionName>()
val usersSnapshot = database.collection("Users")
.get().await()
if (usersSnapshot.isEmpty){
Log.d("FirebaseDebug", "usersSnapshot is empty")
}
for (userDocument in usersSnapshot.documents) {
val userId = userDocument.id
val constructionsSnapshot = userDocument.reference.collection("construcitonName").get().await()
for (constructionDocument in constructionsSnapshot.documents) {
val data = constructionDocument.data
val message = data?.get("message") as? String ?: ""
val title = data?.get("title") as? String ?: ""
val photoUrl = data?.get("photoUrl") as? String ?: ""
val timestamp = data?.get("timeStamp") as? Number ?: 0
val constructionName = ConstructionName(
userId,
constructionDocument.id,
message,
title,
photoUrl,
timestamp.toLong()
)
constructionNames.add(constructionName)
}
}
constructionNames.toList()
}
}
}
答:
0赞
Muhammed Ali ERKOÇ
11/18/2023
#1
我解决了这个问题。我编辑了我的保存函数,如下所示。我必须将信息(即使信息是空的)输入到我在创建引用时使用的文档中。否则,我会遇到类似“不存在的祖先文档”之类的错误。
override suspend fun saveArea(dataModel: DataModel): Result<Unit> {
return kotlin.runCatching {
val post = hashMapOf(
"message" to dataModel.message,
"title" to dataModel.title,
"photoUrl" to dataModel.photoUrl,
"timeStamp" to dataModel.timestamp
)
val currentUserRef = database.collection("Users").document(dataModel.currentUser)
val constructionSiteRef = currentUserRef.collection("construcitonName").document(dataModel.constructionArea)
//Create the parent document
currentUserRef.set(hashMapOf("dummyField" to "dummyValue")).await()
constructionSiteRef.set(hashMapOf("dummyField" to "dummyValue")).await()
val postsRef = constructionSiteRef.collection("posts").document("20231117")
postsRef.set(post).await()
}
}
评论
dataModel.currentUser