Ionic framework 从firebase检索聊天系统的数据

Ionic framework 从firebase检索聊天系统的数据,ionic-framework,firebase,Ionic Framework,Firebase,这是我的firebase数据- 我在两个用户下存储每条消息的副本- 我有两个问题- Q1-用于以有序方式提取用户1和用户2之间的聊天信息的查询,以便可以在个人聊天窗口中显示- 我写了以下内容: //refuser1 is firebase reference to "https://myapp.firebaseio.com/messages/user1" var messages = []; refuser1.orderByChild("from").equalTo("use

这是我的firebase数据-

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

我有两个问题-

Q1-用于以有序方式提取用户1和用户2之间的聊天信息的查询,以便可以在个人聊天窗口中显示-

我写了以下内容:

//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  /
这是存储和检索个人一对一聊天数据的正确方法吗

问题2-检索数据时,“值”和“添加的子项”事件的行为似乎有所不同-请参见下图- 当我使用
'value'
时,我得到所有子对象,但当我使用
'child\u added'
时,我只得到users1中的第一个子对象。 文档中说,每个初始子项都会触发添加的子项(假设这意味着添加新子项之前存在的所有子项) 我的理解正确吗?我希望NoSQL数据库中的'value'和'child_added'返回相同的结果。

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: ""
在上面的结构中,我将
user1
user2
之间的消息分组在节点
user1\u user2
下。此节点充当这两个用户之间的“私人聊天室”:任何时候,同两个用户聊天时,他们的消息都会添加到此聊天室


Q2)您正在执行
一次('child\u added'
。这意味着您正在告诉Firebase只启动
child\u added
,然后停止启动它。如果您改为启动
('child_added'
它将为每个initila子节点和所有后续添加触发。

请复制/粘贴数据-屏幕截图很难处理。另外,格式化代码。值事件在一个节点捕获所有内容并将其发送到应用程序。如果该节点有1000个子节点,您将一次性获得它们-在code.Ad中迭代它们ded事件在每个子节点上迭代一次并将其传递给每个子节点的应用程序,然后它将通知应用程序添加的任何其他子节点。此外:如果您有两个问题,请分别提问。这样,人们可以分别回答每个问题。哦,您可能想查看一下(添加了子节点)。这将导致添加一个单独的子事件,然后事件侦听器将被删除,因此只返回一个子事件。以下是答案。对于未来的问题:每篇文章只回答一个问题,不要使用文本截图。我现在必须在我的答案中键入类似于您的JSON的内容。如果您将JSON作为文本包含,我本来可以复制/粘贴它。以文本格式获取JSON的一个快速方法是使用Firebase仪表板中的导出按钮。谢谢@FrankvanPuffelen。我为屏幕截图道歉,我以后将始终粘贴文本。