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

我正在使用FirebaseAndroid项目上存储数据,并使用Firebase Java API处理数据。 不过,我不确定我是否尽可能高效地完成了这项工作,并且希望获得有关检索和格式化数据的最佳做法的build议。 我的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()函数期间获得POLLS级别的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<T> valueType)方法,但一直没有能够得到它在我的情况下工作,因为我正在使用组合的对象,而不仅仅是容器原始types。 函数如何知道要将Firebase数据分配给模型对象的哪些成员variables? 它是否将Firebase密钥名称与成员variables相匹配,因此这些必须完全相同,区分大小写? 那么如何处理Firebase生成的密钥名称,如推送到List时产生? 如何为构成对象构造模型对象?

Solutions Collecting From Web of "使用Firebase Java API检索/格式化数据的最佳方法"

getValue(java.lang.Class valueType)方法遵循与jackson对象映射库相同的规则(这是我们在内部使用的: http : //wiki.fasterxml.com/JacksonInFiveMinutes )。 所以,你的Java类必须有默认的构造函数(没有参数)和getters为你想分配的属性( https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html #getValue(java.lang.Class) )。 简而言之,是的,Firebase中的关键字名称必须与成员variables匹配。

有关使用复合对象(包括列表)的示例,请参阅AndroidDrawing 。 具体来说, Segment类包含一个Point实例列表。 有一个使用.push()方法生成的数据列表。 由于生成的密钥名称是string,因此它们在客户端可以是唯一的,所以它们反序列化Map而不是List 。 但是,如果您迭代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); }
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

希望有所帮助!

public T getValue(Class valueType)

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

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

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

详情