【问题标题】:Retrieving data from firebase for chat system从 Firebase 检索数据以用于聊天系统
【发布时间】:2015-12-25 16:57:40
【问题描述】:

这是我的 Firebase 数据 -

我在两个用户下存储每条消息的副本 -

我有 2 个问题。 -

Q1 - 以有序方式提取 user1 和 user2 之间的聊天消息的查询,以便显示在个人聊天窗口中 -

我写了以下-

//refuser1 is firebase reference to "https://myapp.firebaseio.com/messages/user1"

var messages = [];        
refuser1.orderByChild("from").equalTo("user1").once('value', function(s){
s.forEach(function(childsnap){
messages.push(s.val());
});
});


refuser1.orderByChild("from").equalTo("user2").once('value', function(s){
 s.forEach(function(childsnap){
 messages.push(s.val());
 });
});
// Now messages array has all messages between user1 and user2 -
// add code to sort messages in array based on timestamp  /

这是存储和检索个人一对一聊天数据的正确方法吗?

Q2 - 在检索数据时,'value' 和 'child_added' 事件的行为似乎不同 - 见下图 - 当我使用 'value' 时,我得到所有子对象,但是当我使用 'child_added' 时,我只得到 users1 中的第一个孩子。 该文档说 child_added 为每个初始孩子触发(假设这意味着在添加新孩子之前存在的所有孩子) 我的理解正确吗?我期待 'value' 和 'child_added' 的返回结果相同

【问题讨论】:

  • 请复制/粘贴数据 - 屏幕截图很难处理。另外,格式化您的代码。值事件在节点上抓取所有内容并将其传递给应用程序。如果节点有 1000 个子节点,您将一次获得所有子节点 - 在代码中遍历它们。添加的事件在每个子节点上迭代一次,并将其传递给每个子节点的应用程序,然后它将通知应用程序添加的任何其他子节点。
  • 另外:如果您有两个问题,请分别提出。这样:人们可以分别回答每个问题。
  • 哦,您可能想查看一次(child_added)。这将导致添加一个子事件,然后事件侦听器将被删除,因此只会返回一个子事件。
  • 答案如下。对于未来的问题:每个帖子坚持一个问题,不要使用文本截图。我现在必须在我的答案中输入一些模仿你的 JSON 的东西。如果您将 JSON 作为文本包含在内,我可以复制/粘贴它。以文本格式获取 JSON 的一种快速方法是使用 Firebase 仪表板中的“导出”按钮。
  • 谢谢@FrankvanPuffelen。我为截图道歉,我以后会一直粘贴文字。

标签: ionic-framework firebase


【解决方案1】:

Q1) 在 NoSQL 数据库中,您通常必须以您希望使用的方式存储数据。如果您想按特定顺序获取特定用户之间的聊天消息,则应以这种方式存储它们。

chats
  user1_user2
    -K...c9
      from: "user1"
      message: "Hello message 1"
      time: ""
    -K...od
      from: "user1"
      message: "Hello message 2"
      time: ""
    -K...t8
      from: "user2"
      message: "Hello message 1"
      time: ""
    -K...c9
      from: "user1"
      message: "Hello message 1"
      time: ""
    -K...xb
      from: "user2"
      message: "Hello message 2"
      time: ""

在上述结构中,我将user1user2 之间的消息分组到节点user1_user2 下。该节点充当这两个用户之间的“私人聊天室”:任何时候相同的两个用户聊天,他们的消息都会添加到这个房间。

Q2) 你在做once('child_added'。这意味着您告诉 Firebase 只触发一次 child_added 然后停止触发它。如果您改为使用 on('child_added'为每个 initila 孩子和所有后续添加触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2023-04-06
    • 1970-01-01
    • 2020-12-29
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多