2017-03-08 23 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"); 
} 
}); 
在功能