2016-06-21 11 views
4

私は、到着日と空港が一致した場合にのみ、飛行データが返される場所でデータを取得しようとしています。私はこれのための最良の解決策を理解しているように見えることはできません。私は、空港または到着日のどちらかが同じであるデータのみを取り出すことができます(両方ともではなく、equalTo()を1回しか使用できません)。ここに私の現在のJavaコードは次のようになります。質問のFirebase multiple WHERE句

   Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS); 
       Query queryRef = ref.orderByChild("airport").equalTo(getAirport()); 
       queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         System.out.println(TAG + " datasnapshot is equal to " + dataSnapshot); 


        } 

ここではデータそのものです:

{ 
"flight" : { 
    "1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : { 
    "airport" : "Gothenburg, Sweden - Landvetter (GOT)", 
    "arrivalDate" : "2016-06-21", 
    "arrivalTime" : "20:58", 
    "code" : "GOT", 
    "departureDate" : "2016-06-23", 
    "departureTime" : "20:58" 
}, 
"c2c86e54-b4d0-4d83-934b-775a86f0a16c" : { 
    "airport" : "Gothenburg, Sweden - Landvetter (GOT)", 
    "arrivalDate" : "2016-06-21", 
    "arrivalTime" : "20:50", 
    "code" : "GOT", 
    "departureDate" : "2016-06-23", 
    "departureTime" : "20:50" 
} 
}, 
"users" : { 
"1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : { 
    "age" : "25", 
    "createdTime" : "1466533088358", 
    "email" : "[email protected]", 
    "provider" : "password", 
    "sex" : "M", 
    "username" : "user2" 
}, 
"c2c86e54-b4d0-4d83-934b-775a86f0a16c" : { 
    "age" : "25", 
    "createdTime" : "1466374588255", 
    "email" : "[email protected]", 
    "provider" : "password", 
    "sex" : "M", 
    "username" : "user1" 
} 
} 
} 

現在のJavaコードはのみが同じ空港を持つすべての子を返します。クライアント側でソートする必要があるデータ量が上記のテストデータよりもはるかに大きい場合は、これは実現できません。ファイアベースの終わりのデータをより良くフィルタリングするにはどうすればいいですか?

答えて

7

リアルタイムデータベースは複数のwhere句をサポートしていませんが、可能にするために余分なキーを作成できます。

"flight"リストの「フライト」は、"arrivalDate""code"の組み合わせキーを持つことができます。

"1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : { 
    "airport" : "Gothenburg, Sweden - Landvetter (GOT)", 
    "arrivalDate" : "2016-06-21", 
    "arrivalTime" : "20:58", 
    "arrivalDate_code": "2016-06-21_GOT", // combined key 
    "code" : "GOT", 
    "departureDate" : "2016-06-23", 
    "departureTime" : "20:58" 
} 

次に、そのキーを照会できます。

/ flights 
/$code 
    /$flight_id 

これはあなたのデータは次のようになります意味:

"flight" : { 
    "GOT": { 
    "1ddf3c02-1f2e-4eb7-93d8-3d8d4f9e3da2" : { 
     "airport" : "Gothenburg, Sweden - Landvetter (GOT)", 
     "arrivalDate" : "2016-06-21", 
     "arrivalTime" : "20:58", 
     "code" : "GOT", 
     "departureDate" : "2016-06-23", 
     "departureTime" : "20:58" 
    } 
    } 
} 

をそしてあなたが策定でき

Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS); 
Query queryRef = ref.orderByChild("arrivalDate_code").equalTo("2016-06-21_GOT"); 
queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

    } 
}); 

別のオプションは、データ構造内のフィールドのOFFキーです次のようなクエリ:

Firebase ref = mFirebaseRef.child(FirebaseReference.CHILD_FLIGHTS); 
Query queryRef = ref.child("GOT").orderByChild("arrivalTime").equalTo("2016-06-21_GOT"); 
queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

    } 
}); 
+0

あなたはこれがhttps://github.com/davideast/であることを意味します。アンドロイドではクエリベースは不可能ですか?ちょうど確認したい!私はfirebaseすぐに願っています –

+3

ではなく、周りにこのような作業の複数のwhere句を書くための方法で構築組み込まれています。 –

0

ネストされたリスナーを使用することを検討してください。 最初にequalToを1つに、結果を変数に、ネストされたリスナーでequalToを2番目に呼び出して結果をチェックします。

このようにしてAndクエリを実行できます。

+3

アンチパテッrnを使ってデータを入れ子にしたり、ネストされたリスナーをリアルタイムデータベースで作成するには、データ構造を再考して、単一の読み込みでフラットな構造を維持することをお勧めします。 –

+2

はい、ありがとうございます。 –