これは私のダミーfirebase構造体です。Firebase Android - uniqueIDに基づいて同じオブジェクトの2つのノードからデータを取得
{ "Restaurant":{
pushId: {
"Node A":{
0:{ id = 1234
// data of some object type
}
1:{ id = 2345
// data of some object type
}
2:{ id = 3456
// data of some object type
}
}
"Node B":{
0:{ id = 6789
// data of some object type
}
1:{ id = 9876
// data of some object type
}
2:{ id = 0000
// data of some object type
}
}
}
}
}
私はいくつかのユニークなID(仮定するID = 1234 & 0000)と、同時に "ノードA" と "ノードB" からデータを抽出したいです。 「ノードA」および「ノードB」は、同じ種類のオブジェクトを含む。私は持っているすべての情報を試しましたが、それを働かせることができました。
私は書いたコードを付けています。以下のコードは実際のデータです。
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshotChildren : dataSnapshot.getChildren()) {
final DatabaseReference reference = dataSnapshotChildren.child(pref.getString("user_uid", null)).getRef();
for (int j = 0; j < stringArray.length; j++) {
Log.d("res_details activity", "stringArray: " + stringArray[j]);
reference.orderByChild("id").equalTo(stringArray[j]).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d("res_details activity", "dataSnapshot: " + dataSnapshot.getValue());
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Restaurant restaurant = singleSnapshot.getValue(Restaurant.class);
Log.d("res_details activity", "restaurant: " + restaurant);
restaurantArrayList.add(restaurant);
}
Log.d("res_details activity", "restaurantArrayList: " + restaurantArrayList.size());
setValue(restaurantArrayList);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d("res_details activity", "databaseError: " + databaseError);
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
すべてのデータベース参照は正しいです。私はログステートメントでチェックした。上記のコードでは、一度に1つの結果しか得られません。私はこのコードを変更するのを手伝ってください。前もって感謝します。どんな提案も感謝しています。
P.S - 実際のfirebase構造のスクリーンショットを添付できませんでした。
更新 新しいスニペット:
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d("res_details activity", "s: " + s);
for (DataSnapshot dataSnapshotChildren : dataSnapshot.getChildren()) {
for (int j = 0; j < stringArray.length; j++) {
Log.d("res_details activity", "reference: " + dataSnapshotChildren.getRef().toString());
Log.d("res_details activity", "stringArray: " + stringArray[j]);
databaseReference.orderByChild("id").equalTo(stringArray[j]).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d("res_details activity", "dataSnapshot: " + dataSnapshot.getValue());
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Restaurant restaurant = singleSnapshot.getValue(Restaurant.class);
Log.d("res_details activity", "restaurant: " + restaurant);
restaurantArrayList.add(restaurant);
}
Log.d("res_details activity", "restaurantArrayList: " + restaurantArrayList.size());
setValue(restaurantArrayList);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
....
私もchildEventListener
を試してみました。今ではそれも入れないchildEventListener
をトリガします。そして、私は今何の結果も得ていない。すべての参照が正しい。クエリが正しいです。なぜスニペットがデータを取得していないのか分かりません。今は完全に混乱する。
この場合、ValueEventListenerは使用するのに適切ではありません。 ValueEventListener.onDataChange()は、特定のデータベース参照に対して常に1回、最後に呼び出されます。 ChildEventListenerを使用してデータを取得する方がよいでしょう。 http://stackoverflow.com/questions/34530566/find-out-if-child-event-listener-on-firebase-completely-load-all-data –
@Taras私は 'childEventListener'でも試しました。しかし、それは動作しません。コードの何が間違っていますか? –