对于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文档中,如果尚未创建引用,则快照对象为空。
/* 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
?
答案 0 :(得分:2)
试试这个:
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
}
}
});
答案 1 :(得分:0)
我找到了解决方案,那是因为数据库规则。 取决于这条线
".read" : "auth != null && $uid == auth.uid && data.exists()"
如果在尚未创建数据的情况下每次调用data.exists()
方法时添加了addValueEventListener->onCancelled
规则。
虽然没有data.exists()
规则,但addValueEventListener
返回了对象snapshot
并且它为空。然后我可以创建if为null,或者如果不为null则更新