2017-09-18 129 views
0

其實我想讓在線用戶不只是整個用戶列表。 這是我的數據庫結構:Firebase數據庫如何根據子值獲取節點?

Users 
    - Uid 
     - online : true 

我想這是網上,而不需要獲得用戶的每一個,然後通過檢查datasnapshot排序它的用戶列表。

回答

1

假設Users節點是火力地堡根,我recomand您使用下面的代碼的直接子:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
Query query = rootRef 
    .child("Users") 
    .child("Uid") 
    .orderByChild("online") 
    .equalTo(true); 
query.addListenerForSingleValueEvent(/* ... */); 

EDIT1:如果你不這樣做請使用以下代碼uid

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference usersRef = rootRef.child("Users"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      String uid = ds.getKey(); 
      Query query = usersRef.child(uid).orderByChild("online").equalTo(true); 
      query.addListenerForSingleValueEvent(/* ... */); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
usersRef.addListenerForSingleValueEvent(eventListener); 

編輯2:正如您在官方文檔中看到的,addListenerForSingleValueEvent爲此位置的數據中的單個更改添加了一個監聽器。這個監聽器將被觸發一次,並且該位置的數據值也會被觸發。

當您編寫數據時,如果您想知道數據的提交時間,可以添加OnCompleteListener,該任務完成時調用。 setValue()updateChildren()方法都採用可選的完成偵聽器,當寫入已提交給數據庫時將調用此偵聽器。這是一個例子:

yourRef.setValue("I'm writing data", new Firebase.CompletionListener() { 
    @Override 
    public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
     if (firebaseError != null) { 
      System.out.println("Data could not be saved. " + firebaseError.getMessage()); 
     } else { 
     System.out.println("Data saved successfully."); 
     } 
    } 
}); 

關於同步,存在當火力地堡完成同步上的給定位置的初始數據,以檢測一種常見的方式。此方法使用Firebase event guarantees之一:

值事件始終始終觸發,並且保證包含在拍攝快照之前發生的任何其他事件的更新。

因此,如果你同時擁有ValueEventListener並在給定的位置ChildEventListener,將ValueEventListener.onDataChange()保證所有onChildAdded()調用發生後調用。

但有一點要記住:Firebase不只是加載數據。它不斷將服務器的數據同步到所有連接的客戶端。因此,數據完全沒有被檢索到。這就是爲什麼你需要刪除偵聽器,如下所述。

此外,請注意,您可以隨時刪除偵聽器。最佳做法是根據您的活動的生命週期將其刪除。

如果您已在onStart中添加聽衆,則必須將其移除在onStop中。 如果您已將收聽者添加到onResume中,則必須將其從中刪除。 如果您已在onCreate中添加聽衆,則必須將其從onDestroy中刪除。 但記住onDestroy並不總是被稱爲。

databaseReference.removeEventListener(valueEventListener); 
+0

但後來我也需要先獲得每個用戶的UID 。 – Anmol

+0

我沒有使用'valueEventListener'或'childEventListener'的原因是,如果節點中有任何更改,它們會繼續運行,它們會再次運行,這會使設備變慢。我也不知道什麼時候所有的用戶都被抓取了。 – Anmol

+0

你在說什麼是不正確的。請看我更新的答案。 –

1

使用此代碼

ref.child('Uid') 

.orderByChild( '在線' ) .equalTo(true);

或使用

FirebaseDatabase.getReference("Users").child("Uid").orderByChild("online").equalTo(true); 
+0

但後來我也需要得到每個用戶的UID第一 – Anmol

相關問題