2016-09-27 9 views
2

新しいFirebaseデータベースフレームワークを使用しているAndroidアプリケーションで作業しています。 enter image description here トップの親(1234-4321)が「チャットルーム」であり、データオブジェクトが「チャットメッセージ」であり、番号付きアイテム(0,1,2)が「チャットルーム」である場合、 「個別のメッセージ」です。Google Firebaseデータベースでフィルタと子要素を利用する方法

私はどんなトラブルもなく、データベース全体を取得し、リスナーを経由して、それを読み取ることができています:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference myRef = database.getReference(); 
myRef.addChildEventListener(this); 
myRef.addValueEventListener(this); 

そして、私はこの方法で、単一の子を取得することができています:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
String id = "1234-4321"; 
DatabaseReference myRef = database.getReference().child(id); 
myRef.addChildEventListener(this); 
myRef.addValueEventListener(this); 

しかし、私私の人生は、同じタイプの複数のオブジェクトを取得する方法を理解できません。つまり、ユーザーは複数のチャットルーム(IE、「1234-4321」と「1234-4432」の両方)を取得できますが、これを行うには、次のいずれかの方法があります。

1)onChildAddedまたはonDataChangeリスナーをループし、String IDに一致するアイテムを分離して更新します。私は特定の子を追加するには

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    if(dataSnapshot != null){ 
     try { 
      ChatObjectV2 objectV2 = (ChatObjectV2) dataSnapshot.getValue(); 
      //Check here for ids and loop through everything 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

または

2非常に大きくなる可能性があり、データベース全体を、)パースしていますので、これは、しかし、非常に非効率的ですが、私はより多くの子供を追加しようとする場合には、ネストされたオブジェクトに「より深く」入っていくときに、「より広い」方向に移動したいと思っています。

//This won't work because it is going 'deeper' instead of 'wider' 
String id = "1234-4321"; 
String id2 = "1234-4432"; 
Query myQuery = myRef.child(id).child(id2); 

その後は同じようリスナーでループスルー、しかし、私は恐ろしく非効率的であるすべてのチャットルームのために異なるDatabaseReferenceを作成する必要があります。

解決策はおそらくfiltersのようですが、私の人生の中で、既存のFirebaseDatabaseオブジェクトとDatabaseReferenceオブジェクトでそれらを利用する方法を理解できません。誰も私がここにリストしたデータスキーマ/モデルに関してフィルタを動作させる方法を知っていますか?

ありがとうございました!

答えて

3

私はこれらの例にあなたのフィルタリングの基本的な使用を説明しようとする:

//最初の二つのチャットルームを取得

Query chatRoomsQuery = databaseReference.limitToLast(2); 

//取得し、最後の2つのチャットルーム

Query chatRoomsQuery = databaseReference.limitToFirst(2) 

//すべてアクティブなIDを取得

Query chatRoomsQuery = databaseReference.orderByChild("active").equalTo(true); 

これは私がthis blogを通過することをお勧めするのと同じ基本的なサンプルです。驚くほど高度なクエリについて説明します

また、these docsまで行くこともできます。彼らはあなたが共有したものとは異なります。

あなたが探していたものかどうかお知らせください。

+0

それらを読んで、間違いなく役に立ちましたが、サンプルのどれも私がしようとしているもののために働かないでしょう。私は本当の目標はここに私のクエリ(IEのどこでID = 123またはどこでID = 321)、私は実際にはどこのドキュメントに表示されない複数の句を追加することだと思います。あなたがこれまでに聞いたことがあるか、それがfirebase(Java/Android)でどのように実行できるか知っていますか? – Silmarilos

+0

だから、あなたはそれらの2つのIDを使うつもりです。 ID1とID2との間の共通の接続は何ですか?それらはどのように関連しますか? –

+0

関係はちょうど彼らのIDがチャットルームのどこかで送信IDか受信IDのどちらかであることである:例えば、顧客Aは2つの「チャットルーム」を開いている、それらによって開始されたチャットルーム、したがって、顧客Aは2つのフィールド(「sentBy」または「receivedBy」)のいずれかにIDを持つことになります。 – Silmarilos

関連する問題