【发布时间】:2017-06-11 07:17:28
【问题描述】:
这是我的虚拟火力基地结构。
{ "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
}
}
}
}
}
我想同时从“节点 A”和“节点 B”中提取具有一些唯一 id 的数据(假设 id = 1234 & 0000)。 “节点 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) {
}
});
所有数据库引用都是正确的。我已经检查了日志语句。上面的代码一次只给我一个结果。请帮我修改此代码使其正常工作。提前致谢。任何建议表示赞赏。
P.S - 我无法附上我真正的 firebase 结构的屏幕截图,因为 stackoverflow 不允许我这样做。
更新 新的 sn-p:
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。我现在没有得到任何结果。所有引用都是正确的。查询是正确的。我不明白为什么 sn-p 不检索数据。现在完全糊涂了。
【问题讨论】:
-
在这种情况下 ValueEventListener 不适合使用。 ValueEventListener.onDataChange() 总是在某个数据库引用上被调用一次并且最后一次。您最好通过 ChildEventListener 检索您的数据。 stackoverflow.com/questions/34530566/…
-
@Taras 我也试过
childEventListener。但它不起作用。代码有什么问题?
标签: android firebase-realtime-database