【问题标题】:How to update multiple nodes in a transaction (Firebase Realtime Database)如何更新事务中的多个节点(Firebase 实时数据库)
【发布时间】:2021-01-31 05:43:24
【问题描述】:

对于以下数据库示例结构:

  {
    "stats": {
      "posts_count": 231,
      "posts_by_category": {
        "sports": {
          "count": 12,
          "foo": "bar"
        }
      },
      "posts_by_language": {
        "english": {
          "count": 12,
          "foo": "bar"
        }
      }
    }
  }

鉴于 [english, sports] 类别中的新帖子,我如何运行具有以下更改的交易:

stats/posts_count +1
stats/posts_by_category/sports/count +1
stats/posts_by_language/english/count +1

基本上我不知道如何导航/编辑 MutableData 对象以反映更改,我想要一个示例(最好不使用 DAO 类)

db.getReference("stats").runTransaction(object : Transaction.Handler {
    override fun doTransaction(currentData: MutableData): Transaction.Result {
        ????
        return Transaction.success(currentData)
    }

    override fun onComplete(
        error: DatabaseError?,
        committed: Boolean,
        currentData: DataSnapshot?
    ) {
    }
})

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    事务在单个节点上运行。因此,如果您想以事务方式更新数据库中的多个分支,则必须在最低的公共祖先节点上运行单个事务。在您的示例中为stats。请注意,这可能会在写操作上产生很多争用。如果stats 节点可能在同一时间被多个客户端更新,这可能会导致多次重试并可能导致事务失败。

    不过,在您的示例中,您似乎希望增加计数器,Firebase 实时数据库自今年早些时候以来将其作为本机操作支持。因此,我不会在 stats 上运行事务,而是对其运行以下更新操作:

    Map<String, Object> updates = new HashMap<>();
    updates.put("posts_count", ServerValue.increment(1));
    updates.put("posts_by_category/sports/count", ServerValue.increment(1));
    updates.put("posts_by_language/english/count", ServerValue.increment(1));
    db.getReference("stats").updateChildren(updates);
    

    注意事项:

    • 此处的键中的/ 是一个允许更新嵌套属性的特殊符号。
    • ServerValue.increment(1) 作为标记发送到数据库,然后由数据库自动执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多