2017-03-08 20 views
0

我在我的应用中使用了Firebase。我有元素的列表,以获取使用此代码:Firebase ChildEventListener如果没有检索到数据

FirebaseDatabase.getInstance() 
.getReferenceFromUrl("myUrl") 
.orderByChild("timestamp") 
.addChildEventListener(this); 

什么是知道,如果一个裁判URL里面有没有数据的最佳方法?因为使用ChildEventListener是不可能的。

ChildEventListener仅具有这4种方法:onChildAdded(),onChildChanged(),onChildRemoved(),onChildMoved()

如果对象没有内部项目,则不会调用这些方法。

所以我的问题是。我是否也必须使用ValueEventListener? 我想onDataChange()被称为如果没有找到项目。

一个可能的方案: 你有项目的列表,检索和使用ChildEventListener填充。 您想覆盖没有检索到项目的情况。因此,显示一个文本“无数据”而不是列表。

+0

尝试:datasnapshot.getChildrenCount()。如果它的0那么没有项目 – Janwilx72

+0

是的,这就是我想..所以你必须使用ChildEventListener和ValueEventListener? – br00

+0

'dataSnapshot'在'ChildEventListener'是一个级别比''由生产ValueEventListener'更深dataSnapshot',所以很遗憾,这将不起作用 – koceeng

回答

0

如果你想要的是时,有没有结果,你可以只设置标签为“无数据”的默认的文本值,并有火力查询重写它显示“无数据”。如果没有结果,它不会被覆盖。

+1

是的,它是正确的,但如果你有在加载过程中的进度条?如何知道何时移除进度条并显示文本? – br00

+0

我想在这种情况下,你只需要结合使用SingleValueEventListener与ChildEventListener –

1

据我所知,如果通过addChildEventListeneraddValueEventListener后直接彼此相同的数据路径上的请求的数据(在代码),你将有addChildEventListener首先完成的结果,则内部ValueEventListeneronDataChange将被执行。

所以我的解决办法是做这样的:

Boolean childExist = false; 

ref.addChildEventListener(new ChildEventListener() { 
    ... onChildAdded() { 
     // you can use List or Map here, this Boolean just to indicate if child exist or not 
     childExist = true; 
    } 
    ... 
}) 
ref.addValueEventListener(new ValueEventListener() { 
    ... onDataChange() { 
     // code you place here will be executed AFTER all of the event inside ChildEventListener is done 
     // here the value of childExist will really indicate if there is child or no 
    } 
    ... 
}); 
+1

这可能是Java,但林假设最接近的解决方案,我们可以得到(这是很愚蠢的,因为使用Javascript火力地堡有$装回调)这会将整个数据集合提取两次... –

+0

可以请您回答以下与Firebase相关的问题:https://stackoverflow.com/q/46605342/6144372 –

0

您可以随时使用只是一个valueEventListener和onDataChange只是检查是否datasnapshot.exists()。在这里的javadoc的线 - 在你的情况>https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#exists

所以

FirebaseDatabase.getInstance() 
     .getReferenceFromUrl("myUrl") 
     .orderByChild("timestamp") 
    .addListenerForSingleValueEvent(new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()){ 
     //Show text retrieved 


     } else { 
    //Show "No data" 
    } 
     } 
@Override 
public void onCancelled(DatabaseError databaseError) { 
Log.v(FB_ERROR_TAG, "Error in Database Connection"); 
} 
}); 
在功能