2017-09-18 17 views
0

実際には、私はオンラインユーザーだけではなく、ユーザーの全リストを取得したい。 これは私のデータベース構造である:私は、ユーザーのそれぞれを取得する必要が、その後datasnapshotをチェックして、それを分類することなく、オンラインでのユーザーの一覧を取得したいFirebaseデータベース子値に基づいてノードを取得する方法は?

Users 
    - Uid 
     - online : true 

答えて

1

を使用し、私はあなたが次のコードを使用して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を使用しています。

指定した場所にValueEventListenerChildEventListenerの両方を持っているのであれば、ValueEventListener.onDataChange()はすべてonChildAdded()のコールが起こった後に呼び出されることが保証されます。

しかし、念頭におくべきこと:Firebaseはデータをロードするだけではありません。サーバーからのデータを接続されたすべてのクライアントに継続的に同期させます。したがって、データが完全に取得される瞬間はありません。そのため、以下で説明するようにリスナーを削除する必要があります。

さらに、必要に応じてリスナーを削除できます。ベストプラクティスは、アクティビティのライフサイクルに応じてそれを削除することです。

onStartにリスナーを追加した場合は、それをonStopで削除する必要があります。 onResumeにリスナーを追加した場合は、それをで削除する必要があります。 onCreateにリスナーを追加した場合は、それをonDestroyで削除する必要があります。 しかし、必ずが呼び出されるとは限りません。

databaseReference.removeEventListener(valueEventListener); 
+0

のUIDを取得する必要がありますが、その後も、私は最初にそれぞれ、すべてのユーザーのUIDを取得する必要があります。 – Anmol

+0

私が 'valueEventListener'または' childEventListener'を使用していないのは、ノード内で何か変更があった場合でも実行を継続するということです。再び実行されるため、デバイスが遅くなります。私もすべてのユーザーが取得されたときに知りに来ることはありません。 – Anmol

+0

あなたの言っていることは正しくありません。私の更新された答えを見てください。 –

1

あなたは、このような子と値を指定することで、あなたのアイテムをフィルタリングすることができます

ref.orderByChild("online").equalTo(true); 
ここ

さらに詳しい情報:https://firebase.google.com/docs/database/android/lists-of-data

+0

が、その後も、私はそれぞれ、すべてのユーザーが最初に – Anmol

1

使用このコード

ref.child('Uid') 

.orderByChild( 'オンライン' ) .equalTo(true);

またはUsersノードがFirebaseルートの直接の子であると仮定すると

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

のUIDを取得する必要がありますが、その後も、私はそれぞれ、すべてのユーザーが最初に – Anmol

関連する問題