更新Firebase中的密钥值

时间:2016-12-02 17:36:45

标签: java android firebase firebase-realtime-database

在Firebase应用程序中安装Firebase RealTime数据库,其中包含web和android作为客户端。通过使用生成随机密钥的push()方法将值插入数据库,并且所有子密钥值对由Web客户端存储在子代中。现在,我想通过android更新特定子项的一些键值对。例如

KHSIHJKJBNJXKCB -
     name="xyz"
     age=19
JHGISFUSHFIJDSF -
     name="abc"
     age=20

如何更新特定密钥的“age”属性,不使用密钥KJHUJHDFIUSH等,只需更新年龄为25,其中name为“abc”。

更新

reference heirarchy

其中“student 0”被Firabase生成的一些随机值替换。所以我想将值“isCertificateReady”更改为false。如何在不知道节点密钥的情况下引用特定节点。对于此示例,我们可以使用联系号码作为唯一ID。

我用来解决问题或让事情得到解答的代码

coachingDatabaseReference.orderByChild("contactNumber")
    .equalTo(contactNumber)
    .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String key = dataSnapshot.getKey();

            coachingDatabaseReference.child(key)
                .child("isCertificateReady")
                .setValue(false);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

2 个答案:

答案 0 :(得分:2)

为此你必须使用查询
就像在Android中一样 datasnapshot.getKey()
Query

然后您可以使用{{1}}调用 然后更新值
Update Specific Keys

答案 1 :(得分:0)

如果名称不唯一,请为学生对象添加一些唯一ID。 如果我们假设名称是唯一的,则可以安全地运行事务并更新内部的特定值,如下所示。

myRef.orderByChild("name").equalTo("abc").runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        Student s = mutableData.getValue(Student.class);
        if (s == null) {
            return Transaction.success(mutableData);
        }

        s.setAge(20);
        // Set value and report transaction success
        mutableData.setValue(s);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b,
                           DataSnapshot dataSnapshot) {
        // Transaction completed
        Log.d(TAG, "postTransaction:onComplete:" + databaseError);
    }
});