具有UserAuthentication的FirebaseDatabase参考对象

时间:2019-04-07 19:28:43

标签: java android android-fragments firebase-realtime-database firebase-authentication

我正在为学校设计一个android应用程序,我很难理解登录用户的Firebase数据库参考对象。这是一个聊天室应用,用户可以注册或登录以进入该应用。进入后,他们可以在聊天室中发送消息,其他登录的授权用户可以看到这些消息。

应用程序结构:

应用程序中的所有内容都是碎片。主要活动首先调用Login片段。如果是新用户,他们可以单击“注册”,并且主要活动将用“注册片段”替换登录片段。登录后,主要活动将用ChatRoom片段替换当前片段。这不是必需的,但是我的用户身份验证步骤在MainActivity中进行。那是在那里发生的唯一与Firebase相关的任务。

我的进度

  1. 我的注册和登录部分正确完成了。
  2. 我能够发送一条消息,并且该消息正确显示在当前用户节点下的数据库中。

我的代码:

我遇到的所有代码都在ChatRoom片段中。
这是我拥有的addEventListener代码:

errorLog.Println()

我面临的问题是,当我从xxx@xxx.com发送消息时,如果数据库中有来自yyy@yyy.com的消息,它们将被添加到该消息顶部的xxx节点上, xxx发送。

这是我的数据库JSON:

来自用户xxx的第一条消息:

ArrayList<ChatMessage> chatData; //ChatMessage is my class that takes the message text, sent user, and time.
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); //Root node
DatabaseReference rootReference = firebaseDatabase.getReference("Users"); //Users node
DatabaseReference currentUserReference; //CurrentUser node
FirebaseUser currentUser; //CurrentUser value is obtained from MainActivity after the user signs in

public void onAttach(Context context) {
    //Other event listeners for buttons......

    chatData = new ArrayList<>();
    rootReference.addValueEventListener(new ValueEventListener() {
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            chatData.clear();
            currentUserReference = rootReference.child(currentUser.getUid());
            for (DataSnapshot snap : dataSnapshot.getChildren()) {
                for (DataSnapshot snapChild : snap.getChildren()) {
                    ChatMessage chatMessage = snapChild.getValue(ChatMessage.class);
                    chatData.add(chatMessage);
                }
            }
            PopulateListView();
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

来自用户xxx的第二条消息:

{
  "Users" : {
    "xxx" : [ {
      "messageText" : "Hello",
      "messageTime" : "2019/04/06 16:32:33",
      "messageUser" : "xxx"
    } ]
  }
}

来自用户yyy的第一条消息:

{
  "Users" : {
    "xxx" : [ {
      "messageText" : "Hello",
      "messageTime" : "2019/04/06 16:32:33",
      "messageUser" : "xxx"
    }, {
      "messageText" : "Hello number 2 from xxx",
      "messageTime" : "2019/04/06 16:33:16",
      "messageUser" : "xxx"
    } ]
  }
}

如何解决此问题?我确切地知道了为什么会这样,这是因为我为所有用户和其中的所有消息嵌套了{ "Users" : { "xxx" : [ { "messageText" : "Hello", "messageTime" : "2019/04/06 16:32:33", "messageUser" : "xxx" }, { "messageText" : "Hello number 2 from xxx", "messageTime" : "2019/04/06 16:33:16", "messageUser" : "xxx" } ], "yyy" : [ { "messageText" : "Hello", "messageTime" : "2019/04/06 16:32:33", "messageUser" : "xxx" }, { "messageText" : "Hello number 2 from xxx", "messageTime" : "2019/04/06 16:33:16", "messageUser" : "xxx" }, { "messageText" : "Hello from yyy", "messageTime" : "2019/04/06 16:34:13", "messageUser" : "yyy" } ] } } 循环,并将其全部添加到当前用户的节点中。但是,如果我将侦听器直接设置到子节点,则我的foreach ArrayList不会填充来自其他用户的消息。我该如何解决?

0 个答案:

没有答案