【问题标题】:Firebase Update Multiple Child value From Multiple Key for Specific Child ValueFirebase 从特定子值的多个键更新多个子值
【发布时间】:2020-01-12 12:37:23
【问题描述】:

我有以下 firebase 数据库结构。我将手机号保存为子名。我需要做的是首先获取具有特定移动值的每个键的tBid 值等于ok 然后添加/减去一个数字,然后更新tBid 下所有键的值b_ookk_node

到目前为止,我已经尝试过下面的代码,但它不起作用。我该如何实现这一点

final String mobile_no = singleToneClass.getInstance().getData();

mDatabasebook = FirebaseDatabase.getInstance().getReference().child("b_ookk_node");
Query ref_book = mDatabase.child(mobile_no).equalTo("ok");

ref_book.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        if (dataSnapshot.hasChildren()) {

            for (DataSnapshot datas: dataSnapshot.getChildren()) {

                final int total_bid = Integer.parseInt(datas.child("tBid").getValue(String.class));
                String t_bid = Integer.toString(total_bid - 1);
                mDatabasebook.child("tBid").setValue(t_bid);

            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    假设您的代码中的 b_ookk_node 与您的 JSON 屏幕截图中的删除节点相匹配,则此代码看起来没问题。但它要求您为每个手机号码define an index,因为索引只能在您指定名称的属性上定义。由于我假设电话号码是用户输入的数据,因此为每个电话号码定义一个索引是不可行的

    简而言之:您当前的数据结构允许您轻松查找推送 ID 的手机号码,但不能轻松查找手机号码的推送 ID。要允许后者,您需要设置一个额外的数据结构,如下所示:

    "number_to_pushid_map": {
      "096554885": {
        "-LyON1kEn...sWpW": true
        "-LyON1kEn...key2": true
      }
    }
    

    在此结构中,您可以查找用户输入的数字的推送 ID。

    另见:


    除此之外:

    • 不需要您代码中的if (dataSnapshot.hasChildren()) {。如果没有子节点,那么dataSnapshot.getChildren() 将已经返回一个空的迭代器,并且永远不会进入循环。
    • 请考虑 using a transaction 更新出价,因为现在两个用户几乎同时更新出价最终可能会覆盖彼此的结果。
    • 考虑将tBid 值存储为数字而不是字符串,这样您就不必不断地来回转换它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多