【问题标题】:Avoid obtaining null currentData at first reading in a Firebase transaction避免在 Firebase 事务中第一次读取时获取 null currentData
【发布时间】: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


    【解决方案1】:

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

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

    另见:

    【讨论】:

    • 其实如果有数据(即随机键“房间”),我想在里面写。但如果没有,我必须创建另一个随机密钥“房间”。所以问题是每次第一次,客户都会创建一个不想要的“房间”。是否有可能知道 (1) currentData 为空和 (2) currentData 的缓存尚未创建(第一个 exe)之间的区别?
    • 由于客户端似乎对状态一无所知,因此无法区分情况1和2。
    • 所以我只看到一种解决方案(如果您看到另一种解决方案,请随时告诉我):通过始终将任何数据(有用或无用)留在此引用中,我可以很容易地知道 currentData 是否为空应该“不”是(我知道这个案子是故意的,即使它有点“惹恼”我)。这是推荐的,还是相反最好不要做这种事情?
    • 我没有完全理解这个问题,所以很难说。但是,如果您在第一次尝试时将房间添加到“空”MutableData,并且由于 rooms 下已经存在数据而重试该事务,那么您最初添加到 MutableData 的房间永远不会在数据库中创建。相反,您的处理程序将再次调用 rooms 中数据的新猜测,您可以设置正确的新状态。
    猜你喜欢
    • 2016-10-08
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多