这是我的结构:
{
users: {
"aufgdheyrl": {
id: "152",
name: "Joe Jackson",
level: "A2",
point: 120.0
},
"yudwjwnecj": {
id: "134",
name: "Samnuel Jackson",
level: "B3",
point: 80.5
},
"fuwhdkcjdo": {
id: "188",
name: "Jack Jack",
level: "B2",
point: 50.0
}
}
}
这是我的代码,只有当其级别或点值大于另一个用户时才能获取所选用户。但查询无效。
我使用mDatabase.child("users").child(id_client)
来获取所选用户的引用。
DatabaseReference mUserRef = mDatabase.child("users").child(id_client);
Query query1 = mUserRef.orderByChild("level").startAt(level);
Query query2 = mUserRef.orderByChild("point").startAt(point);
query1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "datasnaphot " + dataSnapshot.toString());
User user = dataSnapshot.getValue(User.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "getUser:onCancelled", databaseError.toException());
}
});
query2.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "datasnaphot " + dataSnapshot.toString());
User user = dataSnapshot.getValue(User.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "getUser:onCancelled", databaseError.toException());
}
});
例如我有这个值:
String id_client = "aufgdheyrl";
double level = 200.0;
String point = "A1";
query1和query2都返回对象,但query1必须具有空值而不是用户对象 同上,如果我有level =“B1”,则query2返回用户对象而不是空值
答案 0 :(得分:0)
Firebase查询在节点列表上执行,然后在您指定的属性上过滤该列表中的每个子节点。
使用mDatabase.child("users").child(id_client)
,您已经在特定用户的节点中:
"aufgdheyrl": {
id: "152",
name: "Joe Jackson",
level: "A2",
point: 120.0
}
在此处调用orderByChild()
将尝试过滤此JSON的每个子节点。由于子节点是简单值(例如point: 120.0
),因此过滤器将不匹配任何内容。
如果您查询某个级别的用户列表,则更有可能获得所需的结果:
Query query = mDatabase.child("users").orderByChild("level").startAt("B3");
此查询将返回包含yudwjwnecj
的列表。