【问题标题】:Is there an Firebase Realtime Database equivalent to the increment method available in Firestore?是否有与 Firestore 中可用的增量方法等效的 Firebase 实时数据库?
【发布时间】:2020-02-10 00:36:21
【问题描述】:

尽管进行了大量搜索,但我在 Firebase 实时数据库中找不到任何与 Firestore 中可用的增量方法等效的方法。

我要解决的问题是我有一个票务应用程序,它在 Firebase 上为活动的参与者增加一个计数器;但是,如果一个用户离线并正在使用持久数据库注册与会者,而另一个在线用户也在这样做,那么当第一个用户重新在线时,他们会使用他们存储的值加上他们的任何其他与会者来覆盖计数器的值在重新上线之前进行验证。这没有考虑到计数器的值在它们重新联机之前已经更改的事实。将有 6 个人验证活动门票,因此如果有人重新连接并覆盖其他用户注册的值,此值将始终是错误的。所以如果有这样的增量方法:

increment = firebase.firestore.FieldValue.increment(1);

你能告诉我它是什么吗?如果不是,您将如何解决我在 Swift 中设备上的数据持久性问题?

注意我使用的是实时数据库而不是 Firestore,因为当您对数据库进行大量小更新时,建议使用它来提高速度和数据使用率——当您为数千人处理门票时,显然会出现这种情况。

【问题讨论】:

  • 遗憾的是在 rtdb 上没有等价的增量,据此:github.com/firebase/firebase-ios-sdk/issues/257
  • 谢谢——我认为没有。这是我进行的相当详尽的搜索,但我从未看到他们不会将其反向移植到实时数据库的评论。有关如何在 RTD 上处理此问题的任何提示?
  • 我看到了这个帖子:stackoverflow.com/questions/37958109/…,但它有点旧,代码使用了一个监听器。但我不知道它对您的应用程序是否完全安全,因为如果 2 个人同时更新计数,他们可能都捕获了以前的值,而不是将计数更新为 +2,它只会是 +1。

标签: swift firebase firebase-realtime-database google-cloud-firestore


【解决方案1】:

你添加:

ref.update({
  counter: database.ServerValue.increment(1)
});

如果你想减去

ref.update({
  counter: database.ServerValue.increment(-1)
});

【讨论】:

    【解决方案2】:

    实时数据库现在似乎确实具有此功能。 API参考在这里:https://firebase.google.com/docs/reference/js/firebase.database.ServerValue#increment

    基本上在ref.update() 中,您将在要增加的字段上提供database.ServerValue.increment(n)

    例如:

    ref.update({
      counter: database.ServerValue.increment(1)
    });
    

    您也可以提供一个负值来减少:

    ref.update({
      counter: database.ServerValue.increment(-1)
    });
    

    【讨论】:

      【解决方案3】:

      firebase Swift SDK 中有一个新方法 ServerValue.increment()in

      因为不需要往返,所以性能更好,而且更便宜。

      API 文档here

      使用示例:

      firebase.database()
          .ref('somePath')
          .child('someCounter')
          .set(firebase.database.ServerValue.increment(1))
      

      或者你可以递减,只要把-1作为函数arg,就像这样:

      firebase.database()
          .ref('somePath')
          .child('someCounter')
          .set(firebase.database.ServerValue.increment(-1))
      

      【讨论】:

        【解决方案4】:

        在实时数据库中增加值(仅使用客户端代码)的唯一安全方法是使用transaction,这需要客户端应用程序在线。

        如果您需要离线访问,最终会在应用重新上线时进行计数,您可以使用 Cloud Functions 触发器。这里的策略是让客户端应用程序增加一个数字。而是添加或删除每个用户的子值。然后,函数代码将查看该值(可能是真或假)并递增或递减计数器以响应正在写入的位置。

        这是一个视频系列,讨论如何开始,以及最终如何在 Cloud Functions 中针对实时数据库的更改实施子计数器。你可以做类似的事情。

        https://firebase.google.com/docs/functions/video-series/

        【讨论】:

        • 非常感谢 - 我会试一试并标记答案是否正确:)
        • 如果设计和编码正确,它将正常工作。 :) 但是,如果您在此过程中遇到困难,请发布另一个问题。
        猜你喜欢
        • 2017-01-28
        • 2019-10-09
        • 2019-08-07
        • 2018-08-13
        • 2021-08-24
        • 1970-01-01
        • 2018-04-09
        相关资源
        最近更新 更多