我正在开发与firebase的群聊。
Firebase的数据库如下所示:
root
messages
groupId
-uuid
content: "hello"
type: "message"
sender_id: "uuid"
-uuid
content: "hello"
type: "plan"
sender_id: "uuid"
plan_id "uuid"
users
uuid
name: "UserName"
avatar: "url"
plans
uuid:
content: "blah blah"
location: "Blah blah"
例如:我想将消息显示到RecyclerView中,以显示用户的信息,我将执行另一个操作。如果消息的type
是计划的,我将再执行一次操作
我知道对数据进行非规范化是正常的,但我需要坚持使用数据库设计
我使用ChildEventListener
来获取消息,然后使用users
阅读SingleValueEvent
,如果计划plans
则使用SingleValueEvent
阅读type
。
这就是我从firebase获取数据的方式。
mDatabaseReference.child(FIREBASE_CHILD_MESSAGE)
.child(String.valueOf(mConversation.getId()))
.orderByKey()
.limitToLast(mLimit)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
String userPath = "users/" + message.getSenderId();
mDatabaseReference.child(userPath)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
message.setSenderAvatar(user.getAvatar());
message.setSenderName(user.getName());
if (message.getMessageType() == Message.PLAN) {
mDatabaseReference.child(FIREBASE_CHILD_PLANS)
.child(message.getReferenceId())
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Plan plan = dataSnapshot.getValue(Plan.class);
message.setPlan(plan);
if (getMvpView() != null) {
getMvpView().showAddedMessage(message);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
} else {
getMvpView().showAddedMessage(message);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
//TODO
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
//TODO
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
正确的顺序应该是1到15.但如果消息类型是计划的并且我还需要一次读取操作,则不是这样。
message 1
message 2
message 3
message 4
message 6
message 7
message 8
message 10
message 11
message 12
message 14
message 15
message 5 //plan
message 9 //plan
message 13 //plan
目前,我正在使用MVP,最好从Presenter读取所有数据,并将其发送到View。所以我的问题是如何才能以正确的顺序获得结果?