在 Kotlin 中从 firebase 检索数据时,列表返回空

When retrieving data from firebase in Kotlin, the list returns empty

提问人:Muhammed Ali ERKOÇ 提问时间:11/17/2023 最后编辑:Frank van PuffelenMuhammed Ali ERKOÇ 更新时间:11/18/2023 访问量:48

问:

第一种情况:first situation

第二种情况second situation

我正在 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()
        }
    }

}
安卓 Firebase Kotlin 谷歌云 Firestore

评论

0赞 Alex Mamo 11/17/2023
引用内部的值是什么?dataModel.currentUser
0赞 Muhammed Ali ERKOÇ 11/17/2023
等于 firebase 中的身份验证 id,如下所示 val currentUser = viewModel.currentUser?。uid.toString()
0赞 Alex Mamo 11/17/2023
您是否尝试过记录实际值?
0赞 Muhammed Ali ERKOÇ 11/17/2023
是的,我将其记录在保存数据的 saveArea 函数中。与我在 firebase 中看到的相同 Log.d(“FirebaseDebug”, dataModel.currentUser) Log.d(“FirebaseDebug”, dataModel.constructionArea)
0赞 Alex Mamo 11/17/2023
这个问题和这个问题有什么不同?

答:

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()
}

}

https://firebase.google.com/docs/firestore/using-console?authuser=0&_gl=1*11pt0xi*_ga*MjAzNjU4MjAwOS4xNjk0ODY2MDMy*_ga_CW55HF8NVT*MTcwMDIzNTY3Mi44MS4xLjE3MDAyNDIwODAuMzkuMC4w#non-existent_ancestor_documents