在Firebase中查询startAt和endAt时出错

时间:2017-09-07 21:23:29

标签: android firebase firebase-realtime-database

这是我的结构:

{
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返回用户对象而不是空值

1 个答案:

答案 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的列表。