我在我的应用中集成了多房间聊天功能,而且我很难获得特定用户所有聊天室的列表。
结构如下:
使用 childByAutoId 创建房间和成员,如下所示:
FIRUser *user = [FIRAuth auth].currentUser;
mdata[@"uid"] = user.uid;
roomKey = [[_rootRef child:@"messages"] childByAutoId].key;
NSString *memberID = [[[_rootRef child:@"members"] child: roomKey ] child: user.uid ].key;
// set Meta data for member to be able to recognize later
[[[[_rootRef child:@"members"] child: roomKey ] child: memberID ] setValue:mdata];
现在我正在尝试为这样的(硬编码)用户获取房间列表:
-(void) getRoomKeys {
[[[[_rootRef child: @"members"] queryOrderedByChild:@"uid" ] queryEqualToValue:@"QLfRoGpoCjWpzira7fljBj8g3EJ3"]
observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
NSDictionary<NSString *, NSString *> *message = snapshot.value;
}];
}
返回0键/值对。
我会为该用户获得所有房间但是使用这种结构我无法将其他成员添加到该房间。所以我需要深入挖掘一个层次。
那么如何为childByAutoId创建的节点设置查询?
感谢您的帮助!
答案 0 :(得分:3)
尝试考虑这种数据结构。
mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
GetCategories newPost = eventSnapshot.getValue(GetCategories.class);
Log.e("NAME " ,""+ newPost.getName());
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
您可以通过观察{
"rooms": {
"-KQgDxLIt88yPt6nacDu": { ... }
},
"members": {
"QLfRoGpoCjWpzira7fljBj8g3EJ3": { ... }
},
"member-rooms": {
"QLfRoGpoCjWpzira7fljBj8g3EJ3": {
"-KQgDxLIt88yPt6nacDu": true
}
}
}
:
member-rooms/{uid}