如何在Android

时间:2017-12-16 18:22:53

标签: java android json firebase firebase-realtime-database

对于Android来说,这是非常令人困惑的Firebase数据库API。

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

enter image description here

首先,用户创建词汇表,遵循此代码

    /* 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文档中,如果尚未创建引用,则快照对象为空。

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

  1. 我可以查看参考是否存在?然后更新数据。

  2. 如何在第一时间使用addValueEventListener

2 个答案:

答案 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则更新