【发布时间】:2021-10-13 00:41:32
【问题描述】:
我有一个包含“消息”的 db ref,我在创建类时可以获取整个消息列表,但我还想在 limitToLast(1) 中添加一个侦听器,以便我获取每个消息的更新添加消息:
ref.child("messages").child(mConversation.getConversationId()).limitToLast(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (mRecyclerViewAdapter != null) {
Message message = snapshot.getValue(Message.class);
我遇到的问题是,当我尝试将以下快照节点投射到我的对象中时,字段都是空的
{
10={
message=This is my message
senderId=thisIsAUniqueId
}
}
对于列表,我能够获取对话的所有消息并将快照投射到我的消息对象中:
ref.child("messages").child(mConversation.getConversationId()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
ArrayList<Message> messageList = new ArrayList<>();
for (DataSnapshot message : snapshot.getChildren()) {
messageList.add(message.getValue(Message.class));
}
这些都很好,该列表中给定快照的快照节点如下所示:
{
{
message=message1
senderId=id1
}
}
只是想知道如何从前一个节点中获取对象,因为这是我在调用 snapshot.getValue() 时得到的,但在运行时我也不知道该值将是什么getChild("10") 然后将其转换为我的 Message 对象。本质上,我的问题是 limitToLast 给我的级别太高了,我不确定如何获得它的孩子并能够投射到我的 Message 类。我原以为我可以使用 snapshot.getChildren() 然后获取第一个也是唯一的孩子和 getValue(Message.Class) 但我得到了一个迭代器,所以获取第一个孩子并不是超级简单
整个数据库为 JSON:
{
"messages" : {
"conversation1" : [ {
"message" : "message1",
"senderId" : "personId1"
}, {
"message" : "message2",
"senderId" : "personId2"
} ]
},
"users" : {
"personId1" : {
"conversations" : [ {
"conversationId" : "conversation1",
"participantIds" : [ "personId1", "personId2" ]
} ]
},
"personId2" : {
"conversations" : [ {
"conversationId" : "conversation1",
"participantIds" : [ "personId1", "personId2" ]
} ]
}
}
}
【问题讨论】:
-
我不确定我是否完全理解这个问题。您可以编辑您的问题以在
/messages/$conversationId处显示来自 Firebase 控制台的 JSON(作为文本,请不要截图)?您可以通过单击 Firebase Database console 的溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。 -
好了,上传了
标签: java android firebase firebase-realtime-database