火力地堡orderByChild不工作
问题描述:
我有这个数据库:火力地堡orderByChild不工作
event_users
- eventid1:
- userid1: "username1"
- userid2: "username2"
- eventid2:
- userid2: "username2"
- userid4: "username4"
我想获得的所有事件id其中用户号2上存在。所以,就我所关心的,我可以使用orderByChild(userid2)来实现这一点。这是我的代码:
rootRef.child(EVENT_USERS_KEY).orderByChild(uid).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, dataSnapshot.getValue().toString());
final long eventCount = dataSnapshot.getChildrenCount();
Log.d(TAG, String.valueOf(eventCount));
...
}
说'UID'是用户2的用户名,它检索我所有的事件。没关系,因为用户号码2参与了这两个事件。但是,如果我改变了userid1,它仍然检索我所有的事件,而它应该只获得第一个。我是否正确理解orderByChild()方法?
答
为了让所有的事件ID,其中用户号2存在,我建议你创建一个名为users
这样的另一个节点:
event_users
- eventid1:
- userid1: "username1"
- userid2: "username2"
- eventid2:
- userid2: "username2"
- userid4: "username4"
users
- userid1
- events
- eventid1: true
- userid2
- events
- eventid1: true
- eventid2: true
那么,要实现这一点,你只需要设置一个监听器\users\userId\eventId
和从特定事件中获取所有事件id。这个技巧被称为非规范化。我建议你看看这个tutorial。
希望它有帮助。
答
Firebases SDK不允许多级别过滤。
要么你必须遍历每个事件,检查该事件是否包含userid2将其添加到列表如果真正的其他明智忽略。这很容易实现,但将永远执行,如果数据是巨大的
否则,检查Alex Mamo's Answer,这是推荐的方法,但需要修改数据库结构并为以前的数据创建标志。
我已经想过这个了,但是我正在寻找一种更加“优雅”的方式,而不必更改数据库的结构,不过谢谢。 – xBlackout