2017-06-07 159 views
0

我在学生与老师的私人信使应用程序中使用火力地堡的工作,我可以这样根中插入数据: my Firebase DB火力地堡参考查询对根

的用户名是从MySQL数据库retrived,所以我只是只需要进行查询。我想只获取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

你为什么不给'getReference()'提供参数? –

+0

但是你怎么能得到根作为参考? – DeluxeD

+0

你的错误究竟是什么? 'getReference(“chatapp-autosiskola”)'就是我的意思,但这可能并不是必需的 –

回答

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消息列表,那么你应该精确地模拟在数据库:

chatId1 
    chat1Message1: ... 
    chat1Message2: ... 
    chat1Message3: ... 
chatId2 
    chat2Message1: ... 
    chat2Message2: ... 
    chat2Message3: ... 

通过这样的结构:用相同的聊天ID的邮件列表您不需要查询即可阅读特定聊天室的消息。相反,您可以直接访问它们所在的节点:

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