Android版Firebase数据库api非常令人困惑。
我想更新json
对象的某些部分,但不能。这是Firebase数据库。
首先,用户按照以下代码创建词汇表
/* reference of /vocabulary/{user_id}/*/
final DatabaseReference vocabularyRef = FBDatabaseReference.getAllVocabulary(user);
if (!TextUtils.isEmpty(oldName)){
// if vocabulary renamed remove preview
vocabularyRef.child(oldName).removeValue();
}
// set user vocabulary
vocabularyRef.child(String.valueOf(userVocabulary.name())).
setValue(new FBVocabulary(userVocabulary), completionListener);
如果词汇创建成功,用户可以在其中添加单词。
但是在添加单词后,用户可以修改词汇
name
或color
等。在那段时间内,我丢失了所有单词,因为词汇对象已重新创建。根据用于更新子项的Firebase文档,我应该
addListenerForSingleValueEvent
或addValueEventListener
当我使用
addListenerForSingleValueEvent
而不是预览代码时,用户无法创建词汇表。在Firebase文档中,如果未创建引用但快照对象为null。
/* reference of /vocabulary/{user_id}/vocabulary3/ */
final DatabaseReference vocabularyRef = FBDatabaseReference.getAllVocabulary(user).child("vocabulary3");
vocabularyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Object value = dataSnapshot.getValue();
if (value == null){
dataSnapshot.getRef().setValue(new FBVocabulary(userVocabulary), completionListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
在这种情况下,每次调用
onCancelled(DatabaseError databaseError)
都具有以下例外:权限被拒绝。据我了解是因为引用是null
。我可以检查参考是否存在吗?然后更新数据。
第一次如何使用
addValueEventListener
? 最佳答案
尝试这个:
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("vocabulary1");
ref.child("color").setValue(new_value);
ref.child("id").setValue(new_value);
ref.child("footercolor").setValue(new_value);
ref.child("headercolor").setValue(new_value);
//and so on..
您可以执行此操作,从而在不更改
word
节点的值的情况下更新节点下的值。要检查它是否存在,请执行以下操作:
DatabaseReference refs=FirebaseDatabase.getInstance().getReference().child("vocabulary").child("key_here").child("vocabulary1");
refs.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
//dont do anything
}
else{
refs.child("color").setValue(new_value);
//so on
}
}
});