【问题标题】:Android Firebase update existing value instead of setValue creating a new record [duplicate]Android Firebase更新现有值而不是setValue创建新记录[重复]
【发布时间】:2018-03-04 22:46:05
【问题描述】:

我的 Android 应用上有一个按钮,按下该按钮时应更新 Firebase 数据库中的分数;

            // UPDATE DATABASE START
            final String getArgument = getArguments().getString("matchid");
            DatabaseReference database = FirebaseDatabase.getInstance().getReference();
            final DatabaseReference ref = database.child("Matches");
            final Query gameQuery = ref.orderByChild("gameID").equalTo(getArgument);

            gameQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    if(snapshot.exists()){
                        for (DataSnapshot child: snapshot.getChildren()) {
                            ref.child(getArgument).child("homeScore").setValue(5);
                        }
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
            //UPDATE DATABASE END

当我执行代码时,我会在数据库中获得一条新记录,而不是更新现有的字段数据。我通过 Firebase 控制台手动启动了数据库,而不是以编程方式更新记录,因此我使用我在数据库中创建的游戏 ID 作为我的 PK。 我已经将要更新的值硬编码为 5 以使其首先工作。

Firebase 中的数据结构是;

-Matches
 - Match_01
  -matchID
  -homeScore
  -etc....

感谢所有帮助。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    要更新,您需要这样做:

    DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Matches").child("Match_01");
    Map<String, Object> updates = new HashMap<String,Object>();
    
    updates.put("matchID", newID);
    updates.put("homeScore", newscore);
    //etc
    
    ref.updateChildren(updates);
    

    更多信息在这里:

    https://firebase.google.com/docs/database/android/read-and-write#update_specific_fields

    要同时写入一个节点的特定子节点而不覆盖其他子节点,请使用 updateChildren() 方法。

    【讨论】:

    • ref.updateChildren(updates);ref.setValue(updates); 有什么区别?似乎两种方法都做同样的事情
    • setValue 将多次调用数据库,而updateChildren 将进行一次调用。 setValue 也会覆盖父节点下的内容
    猜你喜欢
    • 2023-01-12
    • 2012-07-25
    • 2021-03-30
    • 2011-12-10
    • 2020-06-20
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多