我可以使用orderByChild
和equalTo
获取孩子中特定值的数据(很酷,它也适用于嵌套孩子)
private void getData() {
try {
final DatabaseReference database = FirebaseDatabase.getInstance().getReference();
database.child(Constants.TABLE_TASKS).orderByChild("user/id")
.equalTo("somevalue")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Timber.d(dataSnapshot.toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
是否有一种简单的方法可以获取未找到特定值的数据,基本上类似于notEqualTo("somevalue")
?
答案 0 :(得分:16)
在 Firebase查询模型中,您无法将不等式过滤为值。
但是你可以测试是否缺少任何值(基本上是:没有属性)。例如,使用此数据模型:
{
child1: {
"user": {
"id": 1,
"name": "puf"
}
},
child2: {
"user": {
"id": 2,
"name": "abe"
}
},
child3: {
"user": {
"id": 3
}
}
}
我可以查询没有user/name
属性的孩子:
ref.orderByChild('child/name').equalTo(null)
这导致唯一没有名字的孩子:
child3
随意玩我的jsbin,看看你是否进一步:http://jsbin.com/liyibo/edit?js,console
更新:我知道我之前已经回答了这个问题,但是之前找不到它。这是骗局:is it possible query data that are not equal to the specified condition?。看起来我在那里有一个错误,因为很明显我正在测试上面代码中没有属性。
答案 1 :(得分:12)
我认为我找到了解决方案,这更多的是数据库应该如何设计,实际上现在我理解Firebase指南背后的意图
https://firebase.google.com/docs/database/android/structure-data
原创设计:
{
child1: {
"user": {
"id": "id1",
"name": "puf"
}
},
child2: {
"user": {
"id": "id2",
"name": "abe"
}
},
child3: {
"user": {
"id": "id1"
"name": "puf"
}
}
}
更新设计:
除了存储用户的id和名称之外,我们还应该存储一个id本身作为键的节点并将其标记为true
{
child1: {
"user": {
"id": "id1",
"name": "puf"
"id1": true
}
},
child2: {
"user": {
"id": "id2",
"name": "abe"
"id2": true
}
},
child3: {
"user": {
"id": "id1"
"name": "puf"
"id1": true
}
}
}
使用更新的设计,如果我执行ref.orderByChild('user/id1').equalTo(true)
我会得到输出为Child1和Child 3
如果我执行ref.orderByChild('user/id1').equalTo(null)
,
我会将Child2作为输出