firebase - 避免在 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 中现在有一个子项。
解决方案
在第一次调用时doTransaction
可能currentData
是空的。这与数据库中是否存在数据无关,而是与客户端中对该数据的了解有关。它完全是空的,您的代码应该处理它。
那么如果现有数据不存在,那么事务应该怎么做呢?即使只是将其留空也可以,只要您执行有效的操作,它就会在下一次尝试(或之后的一次尝试)时自动更正。
另见:
推荐阅读
- sql - SQL Server:按组组合值
- c# - LINQ 比较 datetime.now ddmmyyyy
- python - 匹配之前没有特定单词的任何点
- python - 为什么我不能在进程中启动线程?
- python - Django REST Framework - 序列化程序看不到字段
- python - 最近成员附加属性分析
- python - 如何使用 if 条件在循环中增加迭代器?
- ssis - catalog.executions 中 process_id 的值从何而来?
- php - 为什么我不能在我的 PHP 网站上上传大文件?
- jquery - 在 Google Developer Network 标签中找不到网络调用的来源