其實我想讓在線用戶不只是整個用戶列表。 這是我的數據庫結構:Firebase數據庫如何根據子值獲取節點?
Users
- Uid
- online : true
我想這是網上,而不需要獲得用戶的每一個,然後通過檢查datasnapshot排序它的用戶列表。
其實我想讓在線用戶不只是整個用戶列表。 這是我的數據庫結構:Firebase數據庫如何根據子值獲取節點?
Users
- Uid
- online : true
我想這是網上,而不需要獲得用戶的每一個,然後通過檢查datasnapshot排序它的用戶列表。
假設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);
您可以通過指定兒童和值這樣的篩選項目:
ref.orderByChild("online").equalTo(true);
此處瞭解詳情:https://firebase.google.com/docs/database/android/lists-of-data
但後來我也需要得到每個用戶的UID第一 – Anmol
使用此代碼
ref.child('Uid')
.orderByChild( '在線' ) .equalTo(true);
或使用
FirebaseDatabase.getReference("Users").child("Uid").orderByChild("online").equalTo(true);
但後來我也需要得到每個用戶的UID第一 – Anmol
但後來我也需要先獲得每個用戶的UID 。 – Anmol
我沒有使用'valueEventListener'或'childEventListener'的原因是,如果節點中有任何更改,它們會繼續運行,它們會再次運行,這會使設備變慢。我也不知道什麼時候所有的用戶都被抓取了。 – Anmol
你在說什麼是不正確的。請看我更新的答案。 –