我正在为学校设计一个android应用程序,我很难理解登录用户的Firebase数据库参考对象。这是一个聊天室应用,用户可以注册或登录以进入该应用。进入后,他们可以在聊天室中发送消息,其他登录的授权用户可以看到这些消息。
应用程序结构:
应用程序中的所有内容都是碎片。主要活动首先调用Login片段。如果是新用户,他们可以单击“注册”,并且主要活动将用“注册片段”替换登录片段。登录后,主要活动将用ChatRoom片段替换当前片段。这不是必需的,但是我的用户身份验证步骤在MainActivity中进行。那是在那里发生的唯一与Firebase相关的任务。
我的进度
我的代码:
我遇到的所有代码都在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不会填充来自其他用户的消息。我该如何解决?