Firebase-如何更新数据列表?

时间:2018-08-13 13:40:57

标签: java android firebase firebase-realtime-database

我正在使用Firebase开发一个Android聊天应用程序,我想将所有未看到的消息设置为“已看到”。

在消息下:第一个节点是发送者ID,第二个节点是接收者ID,第三个节点是消息ID。

我想将“ seen”字段的值为“ false”的所有消息都设置为“ true”。

该列表的Firebase参考为:

DatabaseReference userMessages = mRootRef.child("Messages").child(mCurrentUser.getUid()).child(mPartnerID);

messages data structure on firebase

Checking the Firebase docs about lists of data they only mention inserting new data into lists and reading lists, but not updating.

问题:如何将"seen": false设置为"seen": true的所有条目?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

要解决此问题,请使用以下代码行:

DatabaseReference userMessages = mRootRef.child("Messages").child(mCurrentUser.getUid()).child(mPartnerID);
Query query = query.orderByChild("seen").equalsTo(false);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            ds.child("seen").getRef().setValue(true);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
};
query.addListenerForSingleValueEvent(valueEventListener);

答案 1 :(得分:1)

另一种更新方法是使用updateChildren()

DatabaseReference userMessages = mRootRef.child("Messages").child(mCurrentUser.getUid()).child(mPartnerID);

userMessages.orderByChild("seen").equalTo(false).addValueEventListener(new ValueEventListener(){
 @Override
public void onDataChange(DataSnapshot dataSnapshot) {
      for(DataSnapshot datas: dataSnapshot.getChildren()){
            String key=datas.getKey();
            Map<String, Object> childUpdates = new HashMap<>();
            childUpdates.put(key+"/seen/", true);
            userMessages.updateChildren(childUpdates);
     }
  }

 @Override
public void onCancelled(FirebaseError firebaseError) {

        }
    });

这里您在mPartnerID处添加了引用,然后添加了一个查询以能够检索所有以seen:false作为子代的键,并使用updateChildren()更新seen字段。

在此处查看更多信息:

https://firebase.google.com/docs/database/android/read-and-write#update_specific_fields