【发布时间】:2021-02-11 17:08:55
【问题描述】:
我是一个相当新的 Firebase 用户,我注意到 currentData can be null the first time it is read by the app since it was launched。 (请相信有我进行交易的数据。)
但是我没有看到任何解决这个问题的方法(除了调用再次执行事务的函数,我想避免),因为如果我添加一个条件来知道 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 中现在有一个子项。
【问题讨论】:
标签: firebase kotlin firebase-realtime-database transactions