如果数据库中没有值,则Android Firebase查询侦听器不会侦听

时间:2018-02-08 12:15:47

标签: java android firebase firebase-realtime-database

我是firebaseandroid的新手。我正在尝试使用firebase为Android开发一个聊天应用程序 用于获取我在firebase查询下面使用的聊天。它正在检索所有消息,如果chatId存在则工作正常。

mChatQuery = mFirebaseChatRef.child(chatId).orderByChild("chatId").equalTo(chatId);
mChatQuery.addChildEventListener(ChatActivity.this);

我遇到的问题是如果chatId不存在,查询不会返回任何值 我的问题是如何识别值为null,而不使用其他查询来检查chatId isExist?

enter image description here

2 个答案:

答案 0 :(得分:2)

试试这个:

  DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(chatId).orderByChild("chatId").equalTo(chatId);
ref.addValueEventListener(new ValueEventListener(){
 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
  if(dataSnapshot.exists()){
      //check if chatid is in the db
     for(DataSnapshot data : dataSnapshot.getChildren()){
            // retrieve also
     }
   }
 else{
         //does not exists, do something here
      } 

}

@Override
public void onCancelled(FirebaseError firebaseError) {


     }
   });

您可以使用上述查询来检索值并检查数据库中是否存在(一个查询)。但if(dataSnasphot.exists())仅适用于valueventlistener而不适用于childeventlistener

答案 1 :(得分:2)

ChildEvent侦听器无法侦听不存在的节点,ValueEvent侦听器可以。

您可以做的是,将相同的查询附加到ValueEventListener。

现在看到这里的诀窍,一个firebase节点永远不会存在零孩子。

在值事件侦听器的onDataChange()方法中,您可以检查上面显示的子计数,并检查节点是否存在。

mChatQuery = mFirebaseChatRef.child(chatId).orderByChild("chatId").equalTo(chatId);
mChatQuery.addValueEventListener((new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        if(dataSnapshot.getChildrenCount()==0){
            //This indicates that the chatId doesn't exist
        }else{
            //Do what you want with the snapshot
        }

    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});