避免在第一次读取 Firebase 事务时获取 null currentData

Avoid obtaining null currentData at first reading in a Firebase transaction

我是 Firebase 的新用户,我注意到 。 (请相信有我做交易的数据。)

但我看不出有任何办法解决这个问题(除了再次调用执行交易的函数,我想避免这种情况),因为如果我添加一个条件来知道 currentData 是否为 null,无论如何,我必须 return Transaction.success(newCurrentData)Transaction.abort()。在这两种情况下,交易 (doTransaction()) 都不会是 re-run。我需要在第一时间知道这个位置的值,因为根据那里的内容,将执行不同的操作。

所以要么修改 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 中编码——但不会改变我问的问题)。如果我 re-run 在不关闭我的应用程序的情况下进行交易,则当前数据中现在有一个 child。

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

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

另见: