Firebase Android:按顺序加入并返回数据

时间:2017-07-15 06:06:45

标签: java android firebase join

我正在开发与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。所以我的问题是如何才能以正确的顺序获得结果?

0 个答案:

没有答案