8

我在项目中Firebase用于数据存储Android,并使用Firebase Java API来处理数据。不过,我不确定我是否尽可能高效地执行此操作,并且我想要一些有关检索和格式化数据的最佳实践的建议。我的Firebase存储库看起来像这样......

-POLLS
    NUMPOLLS - 5
    (pollskey) - NAME - Poll1
            NUMELECTIONS - 2
            ELECTIONS 
                (electionskey) - NAME - Election1
                        NUMNOMINATIONS - 2
                        NUMVOTERS - 2
                        NUMBERTOELECT - 1
                        VOTERS - (votesrkey) - NAME - Charles
                                         NUMBER - (678) 333-4444
                                 .
                                 .
                                 .
                                 (voterskey) - ...
                        NOMINATIONS - (nominationskey) - NAME - Richard Nixon
                                              NUMBEROFVOTES - 2
                                       .
                                       .
                                       .
                                      (nominationskey) - ...
            .
            .
            .
            (electionskey) - ...
     .
     .
     .
     (pollskey) - ...

因此,例如在这里,我试图从民意调查中获取所有数据,以列出民意调查名称、选举名称、候选人姓名和每次选举的票数。DataSnapshot我在这样的主要活动功能期间获得了 POLLS 级别OnCreate()......

private static final Firebase polls = pollsFirebase.child("Polls");
protected void onCreate(Bundle savedInstanceState) {

        polls.addListenerForSingleValueEvent(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot snapshot) {
                for (DataSnapshot child : snapshot.getChildren()) {
                    if (!child.getName().equals("NumPolls")) {
                        createPollTableAndHeaders(child);
                    }
                }

            }
        });
    }

然后我继续通过连续调用读取我需要的各个数据片段getValue()DataSnapshots并检查结果HashMaps...

private void createPollTableAndHeaders(DataSnapshot poll) {
    String pollName = "";
    int numPolls;
    Object p = poll.getValue();
    if (p instanceof HashMap) {
        HashMap pollHash = (HashMap) p;
        if (pollHash.containsKey("Name")) {
            pollName = (String) pollHash.get("Name");
        } 
        if (pollHash.containsKey("Elections")) {
            HashMap election = (HashMap) pollHash.get("Elections");
            Iterator electionIterator = election.values().iterator();
            while (electionIterator.hasNext()) {
                Object electionObj = electionIterator.next();
                if (electionObj instanceof HashMap) {
                    HashMap electionHash = (HashMap) electionObj;
                    if (electionHash.containsKey("Name")) {
                        String electionName = (String) electionHash.get("Name");
                    }
                }
            };
        }
    }

这似乎是一种深入研究数据结构的非常乏味的方法,我想知道是否有更好的方法。

我已经getValue(java.lang.Class<T> valueType)在文档中看到了该方法,但在我的情况下无法让它工作,因为我正在使用组合对象而不仅仅是原始类型的容器。函数如何知道将哪些Firebase数据分配给模型对象的哪些成员变量?它是否将Firebase键名与成员变量匹配,因此它们是否必须完全相同,区分大小写?这将如何处理Firebase生成的键名,如推送到 a 时生成的键名List?如何为组合对象构造模型对象?

4

2 回答 2

17

getValue(java.lang.Class valueType)方法遵循与杰克逊对象映射库相同的规则(这是我们内部使用的:http ://wiki.fasterxml.com/JacksonInFiveMinutes )。因此,您的 Java 类必须具有您想要分配的属性的默认构造函数(无参数)和 getter(https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html #getValue(java.lang.Class))。简而言之,是的,Firebase 中的键名必须与成员变量匹配。

有关使用复合对象(包括列表)的示例,请参阅AndroidDrawing。具体来说,Segment该类包含一个Point实例列表。使用该方法生成的数据列表有一个问题.push()。由于生成的键名是字符串,因此它们在客户端之间是唯一的,因此它们会反序列化Maps 而不是Lists。但是,如果您遍历它们,dataSnapshot.getChildren()它们将按顺序返回。

另外,如果不想反序列化成HashMap,可以使用DataSnapshot上的child()方法。例如:


String pollName = poll.child("Name").getValue(String.class); 
DataSnapshot elections = poll.child("Elections");
for (DataSnapshot election : elections.getChildren()) {
    String electionName = election.child("Name").getValue(String.class);
}

在此示例中,任何不存在的值都将返回为null.

希望有帮助!

于 2013-07-29T19:28:54.730 回答
1

public T getValue(类值类型)

1.类必须有一个不带参数的默认构造函数

2.类必须为要分配的属性定义公共getter。反序列化实例时,没有公共 getter 的属性将设置为其默认值

检查它来自: 这个来源它会帮助你

细节

于 2016-10-18T04:15:20.270 回答