首页 > 解决方案 > 如何更新 Firebase 实时数据库中的现有值?

问题描述

我想更新我的 Firebase 实时数据库中的现有值。我尝试了几种方法,但都没有奏效。有谁知道我该如何解决?如果它有用的话,我会附上数据库的结构以及我到目前为止编写的代码。在此先感谢大家

FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myRef = database.getReference().child("users");

myRef.orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if(snapshot.getValue() != null) {
            //loop through the keys
            Map<String, Object> hashMap = new HashMap<>();
            for(DataSnapshot datasnap : snapshot.getChildren()) {

                if(datasnap.child("email").getValue().toString().equals(email)) {

                    hashMap.put("address", "TEST1");

                    myRef.child(email).updateChildren(hashMap).addOnSuccessListener(new OnSuccessListener() {
                        @Override
                        public void onSuccess(Object o) {
                            Toast.makeText(LocationActivity.this, "Data successfully update",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});

在此处输入图像描述

标签: androidfirebasefirebase-realtime-database

解决方案


您正在更新数据库中的错误位置,这意味着写入现在显示在屏幕截图中或被拒绝(您的代码无法处理)。

要更新address您正在循环的子节点:

myRef.orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for(DataSnapshot datasnap : snapshot.getChildren()) {
            datasnap.child("address").getRef().setValue("TEST1").addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(Object o) {
                    Toast.makeText(LocationActivity.this, "Data successfully update",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});

这里的关键变化是我调用getRef()快照,以获取对数据库中特定位置的引用。

您会注意到我还删除了这两个条件,因为它们都对结果没有任何影响。


推荐阅读