Root上的Firebase参考查询

时间:2017-06-07 21:19:53

标签: android firebase firebase-realtime-database

我正在使用Firebase开发一个学生 - 教师私人信使应用程序,我可以像这样在根目录中插入数据: my Firebase DB

用户名是从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);
}

1 个答案:

答案 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)...

这样可以获得更好的可扩展性。

我建议您阅读NoSQL data modeling并观看Firebase for SQL developers