我正在使用Firebase开发一个学生 - 教师私人信使应用程序,我可以像这样在根目录中插入数据:
用户名是从MySQL数据库中恢复的,所以我只需要进行查询。我想只获取ListView中的数据,其中chatID等于我生成的ID。我在很多地方搜索了here,但无法使 DatabaseReference 正常工作。这是我的代码:
private void displayStudentChatMessages() {
listofMessages = (ListView) findViewById(R.id.list_msg);
adapter = new FirebaseListAdapter<BubbleMessageStudent>(this, BubbleMessageStudent.class, R.layout.item_chat_right, FirebaseDatabase.getInstance().getReference()) {
@Override
protected void populateView(View v, BubbleMessageStudent model, int position) {
TextView studentUsername = (TextView) v.findViewById(R.id.message_user_sender);
TextView studentMessage = (TextView) v.findViewById(R.id.message_user);
TextView studentSentDate = (TextView) v.findViewById(R.id.message_usertime);
studentUsername.setText(model.getStudentUsername());
studentMessage.setText(model.getStudentMessage());
studentSentDate.setText(android.text.format.DateFormat.format("yyyy-MM-dd%n(HH:mm:ss)", model.getStudentMessageTime()));
}
};
listofMessages.setAdapter(adapter);
listofMessages.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
}
答案 0 :(得分:2)
正如@ cricket_007所评论的那样,您需要一个查询来获取具有正确ID的聊天消息:
rootRef = FirebaseDatabase.getInstance().getReference();
chatQuery = rootRef.orderByChild("chatID").equalTo("teststudent-testteacher...");
adapter = new FirebaseListAdapter<BubbleMessageStudent>(
this, BubbleMessageStudent.class, R.layout.item_chat_right, chatQuery)...
使用此代码,您的适配器将仅显示具有正确chatID的消息。
但总的来说,您的数据模型似乎不是最理想的。您实际上已将MySQL数据库中的表映射到Firebase中的节点。它现在可能有效,但有更好的方法来进行这种映射。
在Firebase(以及许多其他NoSQL数据库)中,您应该为您在屏幕上显示的内容建模数据。因此,如果您的应用显示聊天室(具有相同chatID的消息列表),那么您应该在数据库中准确建模:具有相同聊天ID的消息列表:
chatId1
chat1Message1: ...
chat1Message2: ...
chat1Message3: ...
chatId2
chat2Message1: ...
chat2Message2: ...
chat2Message3: ...
使用此结构,您无需查询即可阅读特定聊天室的消息。相反,您可以直接访问他们所在的节点:
chatRoom = rootRef.child("teststudent-testteacher...");
adapter = new FirebaseListAdapter<BubbleMessageStudent>(
this, BubbleMessageStudent.class, R.layout.item_chat_right, chatRoom)...
这样可以获得更好的可扩展性。