【问题标题】:Using Firebase to group chats by conversation使用 Firebase 按对话分组聊天
【发布时间】:2013-07-11 06:30:51
【问题描述】:

我想使用 Firebase 按对话进行群聊。

我有下表:

Chat
- id
- from
- to
- message
- date

我想使用 Firebase 实现以下 SQL 查询:

  1. SELECT * FROM chat where id = 'XX' order by date

  2. SELECT * FROM chat GROUP BY id ORDER BY date

如何使用 Firebase 做到这一点?

我认为要做到#1,我可以做到:

var chatMessagesRef = new Firebase(‘MY.firebaseio.com/chat_messages/chat_id’);
chatMessagesRef.on(‘child_added’, function(snap) {
  console.log( snap.val() );
});

但是我该怎么做#2?以及如何在日期排序上做#1?

【问题讨论】:

  • 我不知道这是否有帮助,但我有一个关于如何创建消息传递功能的 git 存储库。它不会一劳永逸,但也许它会给你一个想法。 github.com/cyrilivargarcia/Messaging

标签: ios firebase


【解决方案1】:

对于组织成单独房间的聊天或聊天对话,请考虑将您的结构修改为以下内容:

/chat_messages/<room-id>/<message-id>/<message-data>

使用此结构,您可以使用您选择的特定名称或使用 .push() 的 Firebase 生成的名称来创建新的房间/对话 ID。每当您想向此房间写新消息时,请执行以下操作:

var chatMessagesRef = new Firebase('<YOUR-FIREBASE>.firebaseio.com/chat_messages');
function sendMessage(roomId, message) {
  chatMessagesRef.child(roomId).push(message);
}

Firebase 本质上有两种查询数据的方法:按路径和按优先级(有关详细信息,请参阅 Firebase Blog: Denormalizing Your Data is Normal。Firebase 推送 ID 会自动生成以按时间顺序排序,因此您可以获取 n 的任何最新消息使用limit() 查询的对话,例如:

chatMessagesRef.child(roomId).limit(20).on('child_added', function(snapshot) { ... });

或者,您可以通过删除上述语句中的 limit() 查询来获取对话的所有消息,并按时间顺序自动排序。

如果您还没有,请查看 Firechat,它是 Firebase 的官方开源聊天客户端,包括一个完整记录的 JavaScript 客户端、数据结构和聊天安全规则。

【讨论】:

  • 如何生成发送者和接收者都可以访问的 roomId?
  • @CyrilIvarGarcia 我会生成一个新的、唯一的 Firebase“推送”ID(“自动”ID 生成),然后将可用房间 ID 列表存储在另一个位置,例如“/rooms” .该列表中的 id 可以是公开的/发件人和收件人都可以访问。
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多