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