【问题标题】:How to update entry in Firebase Database based on an attribute value如何根据属性值更新 Firebase 数据库中的条目
【发布时间】:2022-01-17 00:39:21
【问题描述】:

我在 Java 中使用 Firebase 实时数据库和 Android。我有以下数据库截图:

我想更改属性为“ingredient_name = Lime”的成分的可用性值(从 0 到 1)。属性成分名称实际上类似于主键,这意味着不会有其他具有此特定名称的数据库条目。

我尝试了以下代码

DatabaseReference rootRef;
rootRef = FirebaseDatabase.getInstance("https://....app").getReference();
String ingredientToBeUpdate = "Lime";

rootRef.child("ingredients").orderByChild("ingredient_name").equalTo(ingredientToBeUpdate).child("availability").setValue(1);

但我收到错误“无法解析 'Query' 中的方法 'child'”。您能告诉我如何正确执行此更新吗?所以我想从属性"ingredient_name"等于某个字符串ingredientToBeUpdate的数据库条目中更新值。

【问题讨论】:

    标签: java android firebase-realtime-database


    【解决方案1】:

    Firebase 不支持所谓的更新查询,即您将条件和新数据发送到数据库,数据库会为所有符合条件的节点写入新数据。

    相反,您需要在应用程序代码中执行查询,遍历结果,然后依次更新每个结果:

    rootRef
      .child("ingredients")
      .orderByChild("ingredient_name")
      .equalTo(ingredientToBeUpdate)
      .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ingredientSnapshot: dataSnapshot.getChildren()) {
                ingredientSnapshot.getRef().child("availability").setValue(1);
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException();
        }
    }
    

    另见:

    【讨论】:

    • 非常感谢弗兰克。实际上它有效,但在您的链接答案之一(stackoverflow.com/questions/54814080/…)中,您还提到有一种更短的方法,只需要一行代码mDatabase.child("users").child(u.getUID()).child("playerData/playerMoney").setValue(Math.ceil(tap(playerMoney))); 在我的情况下也可以做这样的事情吗?
    • 感谢弗兰克的回答和帮助。我接受并投了赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多