2017-08-11 10 views
1

orderByChildを使用してクエリを実行し、その子のキーでフィルタしたいと思います。この場合、私のキーと値はどちらも私が望むものを照会するためのデータです。startAt(double value、String key)とendAt(double value、String key)の使い方

私の問題は、キーに数字が含まれているときに表示されます。キーに文字のみがある場合、問題はありません。私はanother answerの勧告を火元から直接読んだので、数字に沿って常に文字を維持しようとしています。

私のJSONは次のとおりです。

{ 
    "my_list":{ 
    "100xyz":{ 
     "value1": 100, 
     "value2": 100, 
     "name":"100xyz" 
    }, 
    "200xyz":{ 
     "value1": 200, 
     "value2": 200, 
     "name":"200xyz" 
    }, 
    "300xyz":{ 
     "value1": 300, 
     "value2": 300, 
     "name":"300xyz" 
    }, 
    "400xyz":{ 
     "value1": 400, 
     "value2": 400, 
     "name":"400xyz" 
    }, 
    "500xyz":{ 
     "value1": 500, 
     "value2": 500, 
     "name":"500xyz" 
    } 
    } 
} 

私のコードは次のとおりです。

DatabaseReference root = FirebaseDatabase.getInstance().getReference().getRoot(); 
DatabaseReference list = root.child("my_list"); 
list.orderByChild("value2").startAt(100, "100xyz").endAt(500, "200xyz").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     SomeModel someModel = dataSnapshot.getValue(SomeModel.class); 
     Log.d("SOME_MODEL", someModel.getName()); 
    } 
}); 

問題は、私は、コンソールで4つのチャイルズを見ることができます:

D/SOME_MODEL: 100xyz 
D/SOME_MODEL: 200xyz 
D/SOME_MODEL: 300xyz 
D/SOME_MODEL: 400xyz 

しかし、私は唯一でなければなりません見た2

D/SOME_MODEL: 100xyz 
D/SOME_MODEL: 200xyz 

私は強調したい:キーが数字を持たない限り動作する。

キーが数字のときにorderByChildとキーで同時にフィルタリングするにはどうすればよいですか?

+0

あなたが話している質問に答えたFirebaserの可能性が高いので(別の質問を参照するとリンクが常に評価されます)、私は助けてくれることを望みます。問題を再現する単一の対応するコードサンプルを使用して、単一のJSONに質問を減らすことはできますか? –

+0

@FrankvanPuffelenリンクをスキップして申し訳ありません、私は昨日からこれを解決しようとしていますが、今は少し疲れています。あなたが提案したエディションを適用しました。私の質問を改善するために何かできることがあれば教えてください。 – cutiko

+0

なぜ 'startAt(String value、String key)'を使用していませんか?あなたは「ダブル」の価値が何を意味すると思いますか? –

答えて

0

endAt()に2つの引数を渡すと、最初に値またはキーのどちらかでクエリが終了すると思われるようです。これはFirebaseでのクエリの動作ではありません。

endAt()の2番目の引数は、クエリが最初の引数に一致するノードを検出した後にのみ使用されます。

endAt(500, "200xyz")を渡すとき、データベースはvalue2(最初の引数)に等しいノードで最初にフィルタリングします。このノードを含むかどうか(技術的にするかどうかを決定するために

"500xyz":{ 
    "value1": 500, 
    "value2": 500, 
    "name":"500xyz" 
} 

これは、キー200xyz(第2引数)を使用する:これは、クエリの最後にこのノードを発見意味する複数のノードのリストで戻って終わる)。参照してください

"100xyz":{ 
    "value1": 100, 
    "value2": 100, 
    "name":"100xyz" 
}, 
"200xyz":{ 
    "value1": 200, 
    "value2": 200, 
    "name":"200xyz" 
}, 
"300xyz":{ 
    "value1": 300, 
    "value2": 300, 
    "name":"300xyz" 
}, 
"400xyz":{ 
    "value1": 400, 
    "value2": 400, 
    "name":"400xyz" 
}, 

関連する問題