実際には、私はオンラインユーザーだけではなく、ユーザーの全リストを取得したい。 これは私のデータベース構造である:私は、ユーザーのそれぞれを取得する必要が、その後datasnapshotをチェックして、それを分類することなく、オンラインでのユーザーの一覧を取得したいFirebaseデータベース子値に基づいてノードを取得する方法は?
Users
- Uid
- online : true
。
実際には、私はオンラインユーザーだけではなく、ユーザーの全リストを取得したい。 これは私のデータベース構造である:私は、ユーザーのそれぞれを取得する必要が、その後datasnapshotをチェックして、それを分類することなく、オンラインでのユーザーの一覧を取得したいFirebaseデータベース子値に基づいてノードを取得する方法は?
Users
- Uid
- online : true
。
を使用し、私はあなたが次のコードを使用して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);
Edit2:公式文書でわかるように、addListenerForSingleValueEventは、この場所にあるデータの1回の変更に対してリスナーを追加します。このリスナーは、その場所のデータの値とともに1回トリガーされます。
データを書き、データがコミットされたことを知りたい場合は、タスクが完了したときに呼び出される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が所定の位置に初期データを同期行われるときを検出する一般的な方法がある:これは一例です。
値イベントは常に最後にトリガされ、そのスナップショットが取られた前に発生した他のイベントからの更新を含むことが保証されています。このアプローチはFirebase event guaranteesの1を使用しています。
指定した場所にValueEventListener
とChildEventListener
の両方を持っているのであれば、ValueEventListener.onDataChange()
はすべてonChildAdded()
のコールが起こった後に呼び出されることが保証されます。
しかし、念頭におくべきこと:Firebaseはデータをロードするだけではありません。サーバーからのデータを接続されたすべてのクライアントに継続的に同期させます。したがって、データが完全に取得される瞬間はありません。そのため、以下で説明するようにリスナーを削除する必要があります。
さらに、必要に応じてリスナーを削除できます。ベストプラクティスは、アクティビティのライフサイクルに応じてそれを削除することです。
onStart
にリスナーを追加した場合は、それをonStop
で削除する必要があります。 onResume
にリスナーを追加した場合は、それをで削除する必要があります。 onCreate
にリスナーを追加した場合は、それをonDestroy
で削除する必要があります。 しかし、必ずが呼び出されるとは限りません。
databaseReference.removeEventListener(valueEventListener);
あなたは、このような子と値を指定することで、あなたのアイテムをフィルタリングすることができます
ref.orderByChild("online").equalTo(true);
ここ
さらに詳しい情報:https://firebase.google.com/docs/database/android/lists-of-data
が、その後も、私はそれぞれ、すべてのユーザーが最初に – Anmol
使用このコード
ref.child('Uid')
.orderByChild( 'オンライン' ) .equalTo(true);
またはUsers
ノードがFirebaseルートの直接の子であると仮定すると
FirebaseDatabase.getReference("Users").child("Uid").orderByChild("online").equalTo(true);
のUIDを取得する必要がありますが、その後も、私はそれぞれ、すべてのユーザーが最初に – Anmol
のUIDを取得する必要がありますが、その後も、私は最初にそれぞれ、すべてのユーザーのUIDを取得する必要があります。 – Anmol
私が 'valueEventListener'または' childEventListener'を使用していないのは、ノード内で何か変更があった場合でも実行を継続するということです。再び実行されるため、デバイスが遅くなります。私もすべてのユーザーが取得されたときに知りに来ることはありません。 – Anmol
あなたの言っていることは正しくありません。私の更新された答えを見てください。 –