避免在第一次读取 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
可能为空。这与数据库中数据的存在无关,而是与客户端对该数据的了解有关。它完全是空的,你的代码应该处理它。
那么如果现有的数据不存在,事务怎么办?即使只是将其留空也可以,只要您做了一些有效的事情,它就会在下一次尝试(或之后的其中一次尝试)时自动更正。
另见:
我是 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
可能为空。这与数据库中数据的存在无关,而是与客户端对该数据的了解有关。它完全是空的,你的代码应该处理它。
那么如果现有的数据不存在,事务怎么办?即使只是将其留空也可以,只要您做了一些有效的事情,它就会在下一次尝试(或之后的其中一次尝试)时自动更正。
另见: