【问题标题】:How to create a ChatOverViiew Query with FirebaseDatabase not loading the whole databse如何使用不加载整个数据库的 Firebase 数据库创建聊天概览查询
【发布时间】:2017-04-13 12:41:59
【问题描述】:

我的 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 中。谢谢 :)

【问题讨论】:

    标签: android firebase firebase-realtime-database firebaseui


    【解决方案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}

    【讨论】:

    • 这表示冗余数据,但只要没有合适的方式创建RecyclerAdapter,我就那样做
    【解决方案2】:

    好吧,如果我正确理解您的要求,如果您使用 push() 为消息创建 ID,则使用 1 作为参数的 limitToLast 方法可能会完成这项工作

    【讨论】:

    • 这不是限制结果的数量吗?我不想这样做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2017-10-23
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多