Firebase与Angular一对一聊天

时间:2017-06-05 17:38:48

标签: firebase firebase-realtime-database angularfire2 nosql

我想进行一对一的聊天。每个用户都可以联系其他用户。

Json结构将是:

{
  "messages" :
       "user1UID_user2UID" : {
             auto generated ID : {
                      "text" : "hello",
                      "timestamp" : 192564646546,
                      "name" : "user1"
             },
             auto generated ID : {
                      "text" : "hi",
                      "timestamp" : 192564646554,
                      "name" : "user2"
             }
         }
}

当user1连接到应用程序时,他可以看到他所属的每个对话的列表。 假设他已经开始与用户2进行对话,用户3也与他进行了对话。

所以我们会有以下孩子:

  

user1UID_user2UID

     

user3UID_user1UID

如何检索User1参与的所有会话?

constructor(db: AngularFireDatabase) {
    this.messages= db.list('/messages/' + user1UID + "_" + user2UID); //but I don't know user2UID at this moment
}

我可以制作正则表达式,还是每次关注他时都必须存储会话密钥(某处)?

或者我完全错了,我不会以正确的方式看问题?

1 个答案:

答案 0 :(得分:2)

您用于聊天室的关键命名架构是我的答案的变体:http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase。这是一个变体,因为你似乎没有按字典顺序排列UID,我推荐。

我提出的所有算法都是为特定用户之间的聊天室生成可重现的,唯一的幂等密钥。虽然这些是数据模型非常重要的属性,但它们并没有神奇地解决其他用例。

与NoSQL数据建模中的情况一样,您必须对数据建模以适应您想要的用例。因此,如果您的应用要求您为每个用户显示聊天室列表,那么您应该在数据模型中包含每个用户的聊天室列表:

if (!System.Windows.Application.Current.Windows.OfType<ButtonListView>().Any())
{
    ButtonListViewModel buttonListViewModel = new ButtonListViewModel();
    ButtonListView winconfigRole = new ButtonListView();
    winconfigRole.DataContext = buttonListViewModel;
    winconfigRole.Owner = System.Windows.Application.Current.Windows.OfType<ConfigRole>().FirstOrDefault(); //<--
    winconfigRole.Show();
    winconfigRole.Topmost = true;
    winconfigRole.Focus();
}

现在获取用户的聊天室列表就像阅读userChatRooms user1UID user1UID_user2UID user1UID_user3UID user2UID user1UID_user2UID user1UID_user3UID user3UID user1UID_user3UID 一样简单。