【问题标题】:Firebase Nested SnapshotFirebase 嵌套快照
【发布时间】: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


【解决方案1】:

我想我理解这个问题,至少如果你的问题中的第一个 sn-p 不起作用,而第二个起作用。

当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

您需要在您的onDataChange 中处理此问题,就像您在第二个 sn-p 中所做的那样。所以:

ref.child("messages").child(mConversation.getConversationId()).limitToLast(1).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if (mRecyclerViewAdapter != null) {
            for (DataSnapshot message : snapshot.getChildren()) {
                Message message = message.getValue(Message.class);
                ...

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多