Android版Firebase数据库api非常令人困惑。

我想更新json对象的某些部分,但不能。这是Firebase数据库。

java - 如何在Android中首次使用addValueEventListener-LMLPHP

首先,用户按照以下代码创建词汇表

    /* 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);


如果词汇创建成功,用户可以在其中添加单词。
但是在添加单词后,用户可以修改词汇namecolor等。在那段时间内,我丢失了所有单词,因为词汇对象已重新创建。

根据用于更新子项的Firebase文档,我应该addListenerForSingleValueEventaddValueEventListener
当我使用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
                    }
                  }
               });

07-24 09:50
查看更多