gpt4 book ai didi

android - Firestore runTransaction() 和离线工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:32 25 4
gpt4 key购买 nike

我正在使用事务在 Firestore 中实现帖子点赞和评论功能。我使用事务是因为我需要在喜欢/评论子集合中添加新字段并更新帖子的计数器,并将帖子 ID 添加到用户喜欢/评论的帖子集合中。

我注意到如果我处于离线状态并且我这样请求我的帖子一切正常:

val postDocRef = FirebaseUtil.postsColRef.document(postId)

postDocRef.get().addOnSuccessListener { doc ->
val post = doc.toObject(Post::class.java)
Timber.e(post.toString())
}

但是如果我在事务中做同样的事情就会抛出异常:

val postDocRef = FirebaseUtil.postsColRef.document(postId)

FirebaseUtil.firestore.runTransaction(Transaction.Function<Void> { transaction ->
val post = transaction.get(postDocRef).toObject(Post::class.java)
}

异常(exception)是:

com.google.firebase.firestore.FirebaseFirestoreException: UNAVAILABLE

为什么离线模式在交易中不起作用?是否可以离线实现此功能(在子集合中添加条目并更新不同对象中的字段)?

continueWithTask() 调用链替换事务有什么缺点?

最佳答案

不,这对于交易来说是不可能的,因为它们本质上是依赖于网络的。当您使用事务时,您是在告诉 Firestore 您只能同步执行数据库操作,一个客户端一个接一个地执行。交易对于游戏内货币转账之类的事情很有用,在这种情况下,您需要确保不会意外地加倍写入并给用户太多或太少的钱。

如果您的点赞计数器需要非常精确,我建议使用子集合,其中每个文档都包含对给定帖子点赞的用户的引用。然后,在 Cloud Functions 中,您可以使用交易来计算喜欢帖子的用户数量,并确保没有计算错误。这还有一个额外的好处,就是让您知道谁喜欢某个帖子,如果您决定添加更多类似的相关功能,这应该是 future 的证明。在客户端,即使您没有权限,您也可以通过向柜台写信来“欺骗”它。我还没有测试过这个,但我很确定写入会在本地成功,然后只有在你重新上线后才会失败。不过这并不重要,因为 Cloud Function 会随后同步柜台服务器端。

另一方面,如果您真的不关心拥有 super 精确的点赞数,那么您正在寻找的是 WriteBatch 类。这是 Firestore 中的新功能,非常酷。我正在发布我写的关于 Firestore 的帖子,但这里是摘录:

Cloud Firestore also includes an awesome new way to batch writes with the WriteBatch class. It’s very similar to the SharedPreferences.Editor you’ll find on Android. You can add or update documents in the WriteBatch instance, but they won’t be visible to your app until you call WriteBatch#commit(). I’ve created the standard Kotlin improvement where the batch lifecycle is managed for you — feel free to copypasta.

inline fun firestoreBatch(transaction: WriteBatch.() -> Unit): Task<Void> = FirebaseFirestore.getInstance().batch().run {
transaction()
commit()
}

关于android - Firestore runTransaction() 和离线工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46634746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com