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

Java 如果数据库中没有值,则Android Firebase查询侦听器不侦听,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我不熟悉firebase和android。我正在尝试使用firebase为android开发聊天应用程序。 获取我在firebase查询下面使用的聊天记录。它正在检索所有消息,如果存在chatId,则工作正常 mChatQuery = mFirebaseChatRef.child(chatId).orderByChild("chatId").equalTo(chatId); mChatQuery.addChildEventListener(ChatActivity.this); 我面临的问题是

我不熟悉
firebase
android
。我正在尝试使用firebase为android开发聊天应用程序。
获取我在firebase查询下面使用的聊天记录。它正在检索所有消息,如果存在
chatId
,则工作正常

mChatQuery = mFirebaseChatRef.child(chatId).orderByChild("chatId").equalTo(chatId);
mChatQuery.addChildEventListener(ChatActivity.this);
我面临的问题是,如果
chatId
不存在,则查询不会返回任何值。
我的问题是如何识别值为
null
,而不使用另一个查询来检查
chatId
isExist

试试这个:

  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) {


     }
   });
您可以使用上面的查询来检索该值,并检查它是否存在于数据库中(一个查询)。但是
如果(datasnaphot.exists())
仅适用于valueventlistener,而不适用于childeventlistener

请尝试以下操作:

  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) {


     }
   });

您可以使用上面的查询来检索该值,并检查它是否存在于数据库中(一个查询)。但是
如果(datasnaphot.exists())
仅适用于valueventlistener,而不适用于childeventlistener

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

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

现在看这里的技巧,firebase节点永远不可能存在零子节点

在value event listener的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) {

    }
});

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

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

现在看这里的技巧,firebase节点永远不可能存在零子节点

在value event listener的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) {

    }
});

不工作:(如果
chatid
不存在,
onDataChange
甚至不调用remove
orderByChild(“chatid”).equalTo(chatid);
@Aabauser您是否像上面那样尝试过它?那么在引用之前,只需检查
chatid
是否为空。不,我无法删除
orderByChild(“chatid”).equalTo(chatid)
,因为datasnapshot getChildren还有一些其他值。这会影响逻辑。我只需要使用
ChildEventListener
@PeterHaddad@Aabauser好的,检查chatId是否为null。但您仍然可以保留它并使用valueeventlistener,您只需添加for循环,如应答中所示不起作用:(如果
chatid
不存在,
onDataChange
甚至不调用remove
orderByChild(“chatid”).equalTo(chatid);
@Aabauser您是否像上面那样尝试过它?那么在引用之前,只需检查
chatid
是否为空。不,我无法删除
orderByChild(“chatid”).equalTo(chatid)
,因为datasnapshot getChildren还有一些其他值。这会影响逻辑。我只需要使用
ChildEventListener
@PeterHaddad@Aabauser好的,检查chatId是否为null。但是您仍然可以保留它并使用valueeventlistener,您只需添加for循环,如答案中所示