- 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 设置一个数据库,但是我尝试重新安装 pod 和许多其他东西,但我仍然无法让它工作,因为它显示了这个错误: Type 'Firestore' has no memb
我需要更改我的项目 ID,因为要验证的 Firebase 身份验证链接在链接上显示了项目 ID,并且由于品牌 reshape ,项目名称已更改。根据我发现的信息,更改项目 ID 似乎不太可能。我正在考
快速提问。长话短说,我在我的谷歌云功能日志中收到此错误: Firestore (4.10.1):无法到达 Firestore 后端。 这是我的函数文件中的代码: // pull in firebas
我正在从事 Angular 6 项目。这是我使用 --prod 构建时遇到的错误标记、主持和运行。我已经坐了很长时间了。最初认为这可能是 firestore 包的问题,我等了。但是现在更新到fir
我正在开发一个 React 项目,这是我的第一个 React 项目。此代码部署成功。但在使用 postman 测试时出现一些错误。我“发布”“createScream”函数的 URL 并发送它。然后我
我有一个包含两个集合的 Firestore 数据库:用户和锦标赛。用户具有“参与者”角色和“管理员”角色,并在用户文档中由“isParticipant”和“isAdmin” bool 值指示: /us
Firebase 数据库根据他们的文档提供了 10 MB 的离线数据库缓存限制,但没有提到 的离线数据限制。 Firestore 数据库。 Firestore 的离线数据保存限制是多少? 最佳答案 根
我正在尝试评估 string在 Firestore 安全规则 基于 matches正则表达式功能 我的代码是 username.matches('^(?!\.)(?!_)(?!.*\.$)(?!.*?
是否可以在 Firestore 中定义具有唯一约束的索引?如果没有,如何在文档字段上强制执行唯一性(不使用文档 ID)? 最佳答案 是的,这可以通过结合使用两个集合、Firestore 规则和批量写入
我正在学习 GCP,在他们的 Firestore 中,我对 Admin.firestore 和 Firebase.firestore 的区别感到困惑。 这是管理员的代码: const admin =
使用带有自定义声明的 firestore 在线安全模拟会导致错误,但它在部署时可以完美运行(同时实际处理真实请求)。错误是: Error: simulator.rules line [5], colu
所以,我知道有一些类似命名的问题,但这是不一样的。 我很想知道是否有人可以解释缺少 increment 的原因。哨兵,类似于delete一。 据我所知,字段删除与文档更新没有什么不同。意思是,我只能
我想创建两个带有分页选项的查询。在第一个记录中,我想获取前十条记录,在第二个记录中,我想获取其他所有记录: .startAt(0) .limit(10) .startAt(9) .limit(null
我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗? 设置: 我的应用程序将有许多用户将参与的测验。 每个测验都会有多个问题。 每个问题都有多个答案,只能选择一个。 每个用户只能回
我正在努力为我的应用寻找最佳架构。我应该使用顶级集合、子集合、数组等吗? 设置: 我的应用程序将有许多用户将参与的测验。 每个测验都会有多个问题。 每个问题都有多个答案,只能选择一个。 每个用户只能回
我无法在任何地方找到我可以在一个Collection中获得的文档数量的限制。假设我有1,000,000,000个文档...那有可能吗?如果我想把它们全部都拿走,实际上会给我十亿吗? 最佳答案 可以存储
假设我有一个集合 mycollection有 1,000,000 条记录。 此查询将返回多少条记录? const query = firestore.collection('mycollection'
这是错误消息:@firebase/firestore: Firestore (4.12.1): Could not reach Firestore backend 我正在构建一个网络应用程序,它今天运
我在编写和测试我的 Firestore 规则时遇到了一个奇怪的问题。这是我想要实现的目标: 当应用程序启动时,用户会匿名登录。这用户开始新游戏。 我创建了一个基本上只包含时间戳的“ session ”
我是云函数的新手。我有一些困惑。 admin.firestore 和functions.firestore? admin.database 是实时数据库吗? 因此,如果云函数基本上是用 JavaScr
我是一名优秀的程序员,十分优秀!