gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:44 25 4
gpt4 key购买 nike

我正在使用 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) - ...

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

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生成的 key 名称,如推送到 List 时生成的?如何为组合对象构建模型对象?

最佳答案

getValue(java.lang.Class valueType) 方法遵循与 jackson 对象映射库相同的规则(这是我们内部使用的: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() 方法生成的数据列表有一个问题。由于生成的键名称是字符串,因此它们在客户端之间是唯一的,因此它们反序列化 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);
}

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

希望对您有所帮助!

关于java - 使用 Firebase Java API 检索/格式化数据的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17931269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com