【问题标题】:Update Multiple Firebase nodes更新多个 Firebase 节点
【发布时间】:2017-12-28 15:44:15
【问题描述】:

我需要更新从 服务器端发布的 firebase 数据中的几个节点。需要从设备端将节点“is_done”更新为 0/1。我尝试了不同的解决方案但一切都变得徒劳,即它在“计划”节点之外添加了一个不同的节点。

我试过的代码 sn-p

private void updatemultiplefirebasedata() {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        final DatabaseReference reference = firebaseDatabase.getReference();
        Query query = reference.child("schedule").child("22-12-2017").child("route").child("1").child("kid").child("21");
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for(DataSnapshot d : dataSnapshot.getChildren()) {
                        Log.d("Keys",String.valueOf(d.getKey())); //returning all the keys
                        HashMap<String, Object> result = new HashMap<>();
                        result.put("is_done", "0");
                    reference.child(String.valueOf(d.getKey())).updateChildren(result);  //update according to keys
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

【问题讨论】:

  • 所有键都在日志中正确出现?
  • 是的,它正在返回 1,2
  • 检查我的答案@avik

标签: android firebase firebase-realtime-database


【解决方案1】:

那是因为您的数据库引用仍然指向树的根。您应该为 reference 分配所需的路径。

另外:您不需要查询即可直接访问数据。您可以简单地将侦听器附加到数据库引用。

private void updatemultiplefirebasedata() {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        final DatabaseReference reference = firebaseDatabase.getReference().child("schedule").child("22-12-2017").child("route").child("1").child("kid").child("21");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for(DataSnapshot d : dataSnapshot.getChildren()) {
                        Log.d("Keys",String.valueOf(d.getKey())); //returning all the keys
                        HashMap<String, Object> result = new HashMap<>();
                        result.put("is_done", "0");
                    reference.child(String.valueOf(d.getKey())).updateChildren(result);  //update according to keys
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

【讨论】:

  • 如果更新是在 for 循环中完成的,那么它也可以直接使用 set 更新,因为它总是将值设置为 0。
  • 否则 hashmap 应该被填充到 for 循环中,并且应该在循环外适当地调用 update 以更新单个调用中的所有值。
  • @UmarHussain 好点。随意点击该编辑按钮并相应地更新我的答案。
【解决方案2】:

试试这个:

reference.child(d.getKey()).updateChildren(result);  

从子项中删除 String.valueOf ,因为您的密钥是整数并且您将其作为字符串传递,因此它不会将其指向相同的 child,而是使用 String "1" 创建新密钥

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 2021-05-27
    相关资源
    最近更新 更多