- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用事务在 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 theSharedPreferences.Editor
you’ll find on Android. You can add or update documents in theWriteBatch
instance, but they won’t be visible to your app until you callWriteBatch#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/
我正在使用事务在 Firestore 中实现帖子点赞和评论功能。我使用事务是因为我需要在喜欢/评论子集合中添加新字段并更新帖子的计数器,并将帖子 ID 添加到用户喜欢/评论的帖子集合中。 我注意到如果
我遇到了最奇怪的问题。有一天,runTransaction 突然完全停止运行。没有错误。没有消息。我放在那里的任何打印语句都不会运行。没有什么。就好像 runTransaction 语句根本不存在一样
我目前正在编写一个操作,作为其中的一部分,检查并递增 orderID 值并在对话中使用它进行响应。 该代码目前可以运行,但部分执行可能需要长达 10 秒的时间才能执行,这可能会使 action-on-
我收到一个错误,该错误在我的设备屏幕上显示为 NullPointerException(它没有出现在日志中)。 本质上,我是从 .addListenerForSingelValueEvent() 中调
我有两个引用文献要更新: 1. /items/item1/sumlikes: 4 "item1"被 4 个用户喜欢。我需要一个事务,因为多个用户可以同时写入这个值:https://firebase.g
我正在查看这个用于 Flutter (dartlang) 的 Firebase API 的演示程序,并查看了原始来源。我不是在摸索 runTransaction 和 set() 之间的区别,也不是在摸
我正在尝试使用 Firebase 数据库的 runTransaction() 但它不起作用。这是我正在使用的代码。 numQuestionRef.runTransaction(new Transact
我使用 Firebase 实时数据库并希望在事务处理中为我的 vector 添加值,即获取 vector 、更新、设置 vector 。 我写了一些简单的 labda,但一直坚持这些代码无法编译。
我正在尝试使用 Firebase 数据库的 runTransaction() 但它不起作用。这是我正在使用的代码。 numQuestionRef.runTransaction(new Transact
我正在开发一个聊天应用程序,用户应该在其中收到有关来自其联系人的新消息的通知。此通知消息还应包括未读消息的数量。因为发送方和接收方都可以更新此信息 runTransaction 是首选。不幸的是,有时
自从开始使用 DatabaseReference.runTransaction 功能,我有一个问题。 已观看最新Google Developers Flutter promotion video ,我
该函数首先进行 Stripe 调用来向用户收费,然后创建一个交易来更新两个不同的文档 - 相关的付款和用户。我不确定如何优化此代码,因为我需要事务逻辑来更新文档。如何优化这个功能? const fun
嗨,我正在尝试在 Flutter 中使用 Firebase Firestore 实现简单的事务。该过程很简单,只需更新两个文件,如下所示: DocumentSnapshot productSnapsh
当我预计用户会同时写入 Firebase 中的某个位置时,我之前调用了 .runtransaction() 方法 private void increasePollTotalVoteCounter(
我是一名优秀的程序员,十分优秀!