首页 > 解决方案 > 避免在 Firebase 事务中首次读取时获取 null currentData

问题描述

我是一个相当新的 Firebase 用户,我注意到currentData 自启动以来第一次被应用读取时可能为 null。(请相信我进行交易的地方有数据。)

但是我没有看到解决这个问题的任何方法(除了调用再次执行事务的函数,我想避免),因为如果我添加一个条件来知道 currentData 是否为空,我必须返回Transaction.success(newCurrentData)或者Transaction.abort()无论如何。在这两种情况下,事务 ( doTransaction()) 都不会重新运行。我需要第一次知道这个位置的值,因为根据那里的不同,将执行不同的操作。

因此,要么修改,runTransaction()以便不再有空的 currentData (这似乎 - 我认为 - 不可能),或者myRef.keepSynced(true)在启动事务之前执行类似创建必要缓存的操作。不幸的是,我不太了解这些功能,也不知道它们是否会起作用。这就是我打电话给你的原因。

这是我交易的相关部分:

var roomName = ""
database.getReference("rooms").runTransaction(object : Transaction.Handler {
    override fun doTransaction(currentData: MutableData): Transaction.Result {
        roomName = currentData.children.toList().randomOrNull()?.key //enter to a random existing room
            ?: database.getReference("rooms").push().key!! // or create one if there is no room
        //Do some stuffs depending on roomName, and update the currentData
        return Transaction.success(currentData)
    }
    override fun onComplete(error: DatabaseError?, committed: Boolean, currentData: DataSnapshot?) {
    }
}

currentData 第一次是空的(实际上它不是空的 - 因为我在 Kotlin 中编码 - 但不会改变我提出的问题)。如果我在不关闭我的应用程序的情况下重新运行事务,则 currentData 中现在有一个子项。

标签: firebasekotlinfirebase-realtime-databasetransactions

解决方案


在第一次调用时doTransaction可能currentData是空的。这与数据库中是否存在数据无关,而是与客户端中对该数据的了解有关。它完全是空的,您的代码应该处理它。

那么如果现有数据不存在,那么事务应该怎么做呢?即使只是将其留空也可以,只要您执行有效的操作,它就会在下一次尝试(或之后的一次尝试)时自动更正。

另见:


推荐阅读