Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Firebase Java API检索/格式化数据的最佳方法_Java_Android_Mobile_Cloud_Firebase - Fatal编程技术网

使用Firebase Java API检索/格式化数据的最佳方法

使用Firebase Java API检索/格式化数据的最佳方法,java,android,mobile,cloud,firebase,Java,Android,Mobile,Cloud,Firebase,我使用Firebase在Android项目上存储数据,并使用Firebase Java API处理数据。不过,我不确定我是否尽可能高效地完成了这项工作,我想听听关于检索和格式化数据的最佳实践的建议。我的Firebase存储库看起来像这样 -POLLS NUMPOLLS - 5 (pollskey) - NAME - Poll1 NUMELECTIONS - 2 ELECTIONS (election

我使用
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) - ...
所以,举个例子,我试图从一次投票中获取所有数据,列出投票名称,选举名称,候选人姓名和每次选举的票数。在我的主要活动的
OnCreate()
函数中,我获得了轮询级别
DataSnapshot

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);
                    }
                }

            }
        });
    }
然后,通过依次调用
DataSnapshots
上的
getValue()
,并检查生成的
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 valueType)
方法,但在我的例子中,它无法工作,因为我使用的是组合对象,而不仅仅是基本类型的容器。函数如何知道要分配给模型对象的哪些成员变量的
Firebase
数据?它是否将
Firebase
键名与成员变量匹配,因此它们是否必须完全相同,区分大小写?这将如何处理
Firebase
生成的密钥名,就像推到
列表时生成的密钥名一样?如何为组合对象构造模型对象

getValue(java.lang.Class valueType)
方法遵循与jackson对象映射库相同的规则(我们在内部使用:)。因此,您的Java类必须为要分配的属性()具有默认构造函数(无参数)和getter。 简而言之,是的,Firebase中的键名称必须与成员变量匹配

有关使用复合对象(包括列表)的示例,请参见。具体来说,
类包含一个
实例列表。使用
.push()
方法生成的数据列表有一个捕获。由于生成的键名是字符串,因此它们在客户端之间是唯一的,因此它们将
映射
s而不是
列表
s反序列化。但是,如果迭代
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

希望有帮助

公共T获取值(类值类型)

1.该类必须具有不接受参数的默认构造函数

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

请从以下位置查看: 它会帮助你的


很酷,谢谢格雷格。给我几个小时回家,试着这样做。谢谢好的,很酷,这就是我需要开始的一切。感谢Greg,感谢您的快速支持。很抱歉提出一个旧线程,但是,我正在使用GeoFire和Firebase,Geolocation类不提供默认构造函数。那么,我应该如何对此类类进行反序列化呢?是否嵌入了反序列化器工厂?谢谢