这是我的虚拟火力架结构。
{ "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) {
}
});
所有数据库引用都是正确的。我已经检查了日志声明。上面的代码一次只给我一个结果。请帮我修改一下这段代码吧。提前致谢。任何建议都表示赞赏。
P.S - 我无法附上我的真实firebase结构的截图,因为stackoverflow不会让我。
更新 新摘要:
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
。我现在没有得到任何结果。所有引用都是正确的。查询是正确的。我不明白为什么片段不检索数据。现在完全混淆了。
答案 0 :(得分:0)
您的快照包含HashMap
个对象。节点A和节点B将被表示为具有对应值(对象)的键。看一下像你这样的数据结构的例子。
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
HashMap<String, Long> m = (HashMap<String, Long>) snapshot.getValue();
Log.d("test", String.valueOf(m.get("id")));
}
}
请配置您的过滤条件,您就可以开始使用了!