在Firebase应用程序中安装Firebase RealTime数据库,其中包含web和android作为客户端。通过使用生成随机密钥的push()
方法将值插入数据库,并且所有子密钥值对由Web客户端存储在子代中。现在,我想通过android更新特定子项的一些键值对。例如
KHSIHJKJBNJXKCB -
name="xyz"
age=19
JHGISFUSHFIJDSF -
name="abc"
age=20
如何更新特定密钥的“age”属性,不使用密钥KJHUJHDFIUSH
等,只需更新年龄为25,其中name为“abc”。
更新
其中“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) {
}
});
答案 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);
}
});