Firebase 查询-访问中的嵌套的对象 Firebase Android

发布时间: 2017/3/19 18:27:13
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 firebase 对象,看起来像这样

posts: {
  -Kc6CT_CF--kVYApIhD9: {
    -comments: {
       -Kc6CkgQ8-5OztuqHqdS {
         text: "Text here",
         timestamp: 1486179732382,
         user: {
              "username": "user1",
              "email": "some@email.com"
         }
       }
    },
    "lat": "37.8136",
    "lng": "144.9631"
  }
}

还有一个 POJO,看起来像这样︰

public class Post {

    private Comment comments;
    private double lat;
    private double lng;
    private String text;
    private String timestamp;
    private Motorist user;


    public Post() {  }

    public Comment getComments() {
        return comments;
    }

    public void setComments(Comment comments) {
        this.comments = comments;
    }

    public double getLat() {
        return lat;
    }

    public void setLat(double lat) {
        this.lat = lat;
    }

    public double getLng() {
        return lng;
    }

    public void setLng(double lng) {
        this.lng = lng;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public Motorist getUser() {
        return user;
    }

    public void setUser(Motorist user) {
        this.user = user;
    }

    public static class Comment {

        String text;
        String timestamp;
        Motorist user;

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public String getTimestamp() {
            return timestamp;
        }

        public void setTimestamp(String timestamp) {
            this.timestamp = timestamp;
        }

        public Motorist getUser() {
            return user;
        }

        public void setUser(Motorist user) {
            this.user = user;
        }
    }
}

这里是在循环中的代码我 posts 对象︰

Map<String, Post> td = new HashMap<String, Post>();
    for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){

        Post post = postSnapshot.getValue(Post.class);

        //for (DataSnapshot commentSnapshot : postSnapshot.child("comments").getChildren()) {
        //    System.out.println(commentSnapshot.getValue());
        //}

        td.put(postSnapshot.getKey(), post);
        Toast.makeText(MapsActivity.this, postSnapshot.getValue().toString(), Toast.LENGTH_SHORT).show();
    }

我使用的 addValueEventListener 。现在,我的问题是数据不能进去 comments 对象。当我运行调试器我 comments 对象是 null 。我错过了什么?还是我的 POJO 错误?

解决方法 1:

在你的代码和数据的结构中有几个问题︰

-comments: {
   -Kc6CkgQ8-5OztuqHqdS {
     text: "Text here",
     timestamp: 1486179732382,
     user: {
          "username": "user1",
          "email": "some@email.com"
     }
   }

如果那 - 的前面的确是 comments ,请将其删除。该节点应该只是被称为 comments 和添加 - 前缀只是让它更难正确处理。

接下来是你代码中的一个问题︰ 下 (现在) comments 你有注释,以推 ID 键列表 (键开始与 -K 。在您的代码中你只过建模的一条评论︰

public class Post {
    private Comment comments;

是没有办法, Firebase 数据库客户端可以映射所有子节点的 comments 到那单 Comment ,所以它会跳过它,当它读取 JSON 时。你的 JSON 结构的正确映射是︰

public class Post {
    public Map<String,Comment> comments;

如果您然后只想要处理的值的评论,你可以让他们与 post.comments.values()

赞助商