如何使用FirebaseDatabase创建ChatOverViiew查询而不加载整个数据库

时间:2017-04-13 12:42:00

标签: android firebase firebase-realtime-database firebaseui

我的Android应用程序我正在使用FirebaseDatabse来编写聊天应用程序。数据结构是:

"message": {
    "user1_guid": {
        "user2_guid": {
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            ...
        },
        "user_n_guid": {
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            ...
        },
    },
    "user2_guid": {
        "user1_guid": {
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            ...
        },
        "user_n_guid": {
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            "messageGuid": < MessageObject > ,
            ...
        },
    }
}

要加载user1的聊天详情,我可以这样做:

final DatabaseReference lDatabaseReference = lDatabase
        .child("message")
        .child(sender)
        .child(mChatPartnerGuid);

并将其加载到A FirebaseRecyclerAdapter(MessageData,ChatDetailsAdapter.MessageViewHolder)

但我现在想要的是制作一个ChatOverviewFragment。它应该只显示每个用户的最新消息,在数据库中有一个对话(就像在WhatsApp中一样)。使用FirebaseRecyclerAdapter意味着必须在所有会话的所有消息中下载整个数据库...

是否有更好的方法来执行仅过滤活动用户与之对话的每个用户的第一条消息的查询?特别是我不知道如何将其加载到FirebaseRecyclerAdapter中。谢谢:)

2 个答案:

答案 0 :(得分:1)

您需要做的是调整数据库结构以满足您的需求。我要做的是创建一个节点,为每个用户包含每个用户收到的最新消息。为了减少“无用”冗余并避免数据损坏,我也会改变你构建的内容并与我们分享。

"messages": {
    "messageId": {
        "text": string,
        "date": long,
        "sender": string,
        "receiver": string
    }
},
"last-messages": {
    "userReceiver": {
        "sender1": messageId,
        "sender2": messageId,
        [...]
    },
    [...]
}

如果您想按要求对其进行排序,只需将"sender1": messageId更改为"sender1": { "messageId": messageId", "date":long}

答案 1 :(得分:0)

好吧,如果我正确地理解了你要求的内容,那么使用1作为参数的limitToLast方法可以完成这项工作,如果你使用push()来创建id消息