【发布时间】:2016-11-16 01:15:05
【问题描述】:
我正在尝试创建“Android 的一对一 Firebase 数据库聊天”。到目前为止,正在使用下面的结构。大字符串代表user_TO_user,KW记录为聊天消息。
chat
D_57f337e7e55df9ca167d0421_TO_O_57f337e7e55df9ca167d0421
-KWd06dvkmcoCJd6fNWs
-KWd7yBoUy-RkEJAlVOB
-KWd8Au5bPAwMsx3gYhp
....
O_57f337e7e55df9ca167d0421_TO_D_57f337e7e55df9ca167d0421
-KWd06da-Cx0qjnPUE3l
-KWd7yBvyLoLd2fiBcia
-KWd8Au3A_5FJZS8S0qz
....
从显示特定用户对话列表的 Android 活动中,我正在创建一个 ListView 并从 Firebase 读取列表:
String calculated = "O_57f337e7e55df9ca167d0421"; // calculated userId
firebase_chat.orderByKey().startAt(calculated).endAt(calculated + "\uf8ff").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s)
{
// add item to list adapter
}
}
这很好用。
但我这里有 2 个问题。
首先。我需要使用反向名称制作节点的副本(如上所示,即 A_TO_B 和 B_TO_A),以允许参与聊天的两个用户使用 Firebase 数据库查询功能(因为 substring() 或 contains() 在 Firebase 中不可用过滤器)。有没有更好的查询方法可以防止我复制所有消息?可能有任何节点别名?
第二。节点名称本身有助于代码识别喋喋不休的名称......但它对用户演示完全没有帮助。我需要在某处关联用户 O_57f337e7e55df9ca167d0421 是“John Smith”以在屏幕上显示 John Smith。这种机制应该适用于每一个会话节点。
我正在考虑使用每个节点中的第一条记录来存储节点元数据,因此,在获取节点名称后,我可以从 Android 设备查询 DataSnapshot 以查找有关该节点的信息。但是,恐怕这会触发每个对话节点的新后端(Firebase DB)请求以获取其元数据,这可能效率不高,并导致来自每个设备的服务器调用过多。正确的解决方案是将元数据包含在每个节点的名称中...这样我就可以保存第二次调用...。但这在 Firebase 中似乎不可行。
你有什么更有效的方法吗?
谢谢
更新:因此,根据 vzsg 的回答,更好的结构可能是:
- 消息
- A_TO_B
- msg1
- msg2
- msg3
- A_TO_C
- msg1
- msg2
- msg3
- A_TO_J
- msg1
- msg2
- msg3
- A_TO_B
- 聊天
- 一个
- A_TO_B
- B
- A_TO_C
- C
- A_TO_J
- J
- A_TO_B
- 乙
- A_TO_B
- 一个
- A_TO_B
- C
- A_TO_C
- 一个
- A_TO_C
- J
- A_TO_J
- 一个
- A_TO_J
- 一个
这将允许:
在打开对话屏幕时创建一个聊天条目
在第一条消息上创建一个消息条目
查询聊天/A节点以查找A用户的对话,包括其他用户的数据
查询消息/A_TO_B 节点以获取对话的实际消息
(我会稍等片刻接受你的回答,但我喜欢这个提议)
update2:或简化聊天节点:
- 聊天
- 一个
- B
- C
- J
- 乙
- 一个
- C
- 一个
- J
- 一个
- 一个
并动态组合对话名称以获取消息
我在这里描述的最终解决方案:https://github.com/cvivek07/Firebase_Chat/issues/1#issuecomment-260925121
【问题讨论】:
标签: android firebase firebase-realtime-database