【问题标题】:Firebase to custom Java objectFirebase 到自定义 Java 对象
【发布时间】:2016-01-19 17:05:30
【问题描述】:
{
  "users": {
    "mchen": {
      "friends": { "brinchen": true },
      "name": "Mary Chen",
      "widgets": { "one": true, "three": true }
    },
    "brinchen": { ... },
    "hmadi": { ... }
  }
}

如何为上面的例子编写自定义对象类? Firebase 中的指南仅显示简单示例。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    像往常一样,您需要一个将 JSON 中的每个属性映射到字段+getter 的 Java 类:

    static class User {
        String name;
        Map<String, Boolean> friends;
        Map<String, Boolean> widgets;
    
        public User() { }
    
        public String getName() { return name; }
        public Map<String, Boolean> getFriends() { return friends; }
        public Map<String, Boolean> getWidgets() { return widgets; }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", friends=" + friends +
                    ", widgets=" + widgets +
                    '}';
        }
    }
    

    我真的只是按照Firebase guide on reading data on Android 的这些说明进行操作:

    我们将创建一个代表博客文章的 Java 类。和上次一样,我们必须确保我们的字段名称与 Firebase 数据库中的属性名称匹配,并为类提供一个默认的无参数构造函数。

    然后你可以像这样加载信息:

    Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/34882779/users");
    ref.addListenerForSingleValueEvent(new ValueEventListenerBase() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                System.out.println(userSnapshot.getKey()+": "+userSnapshot.getValue(User.class));
            }
        }
    });
    

    有了这个输出:

    brinchen: 用户{name='Brin Chen', friends={mchen=true, hmadi=true}, widgets={one=true, three=true, two=true}}

    hmadi: 用户{name='Horace Madi', friends={brinchen=true}, widgets={one=true, two=true}}

    mchen: 用户{name='Mary Chen', friends={brinchen=true}, widgets={one=true, three=true}}

    【讨论】:

    • 非常感谢您的详细解释,您能否进一步解释一下为什么我们需要覆盖 toString()?是因为该对象包含具有列表的子对象吗?我是初学者,感谢您的解释。以前我认为需要使用它来包含一个列表。 List&lt;Map&lt;String, Boolean&gt;&gt; friends 然后我无法绑定到类型错误。
    • 没有要求覆盖toString(),除了它使日志输出更具可读性。下次当您的代码不起作用时:在您的问题中发布该代码。它将减少拒绝/关闭投票。
    • @FrankvanPuffelen 是否有 any 方法来维护多对多关系而不 为每个字段提供 HashMap?我遇到的问题是我已经实现了类似于 FirebaseListAdapter(但作为 RecyclerView.Adapter)自动解析模型的东西。如果我尝试让它解析包含 HashMap 字段的 POJO 的子节点,我会得到 Firebase DB 异常。如果我不清楚,我很乐意就此提出一个完整的问题。
    猜你喜欢
    • 2017-06-23
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多