我在Firebase数据库中有这些数据。
我想要做的是将这个子(list1)映射到java对象上。 当我只想要list1的孩子时,我能够使用以下内容在自定义对象(f.e. ProductFirebase)上映射它们:
FirebaseDatabase database = FirebaseDatabase.getInstance();
//database.setPersistenceEnabled(true);
final DatabaseReference myRef = database.getReference("list1");
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ProductFirebase product = dataSnapshot.getValue(ProductFirebase.class);
}
我真的不知道如何映射所有列表(list1,list2..etc),因为最后两个孩子在结构上与兄弟姐妹不同。
我在想像
这样的东西Map<String<String, ProductFirebase>> list = (Map<String<String, ProductFirebase>>) dataSnapshot.getValue();
但是,当然,最后两个元素不是ProductFirebase而且它不起作用。
有一种方法可以创建一个与dataSnapshot?
的结果匹配的对象还有一件事......只有值为true的节点数量不固定。可能超过2个,这取决于共享列表的人数。
提前致谢
更新:
这是一般情况。我想查询有关键的所有列表&#34; 8ada6af0-de37-495d-8349-0cd4c215fc87&#34;。 所以我期待收到list1和list3。它是!!但现在我遇到了我在本主题第一部分中描述的原始问题。
答案 0 :(得分:1)
你应该重构一下你的数据库。您应该将那些值为true的节点放入一个单独的节点(我在这里称它们为 Ids )。同样对于list1,list2,...节点,您应该创建父节点。例如:
"lists": {
"list1": {
"category": "food",
...
},
"list2": {
...
},
...
},
"ids": {
"8ada6af0-...": true,
...
}
现在,如果您创建另一个自定义对象(让它为Data),其中包含:
// the inner map is one list object
Map<String, Map<String, ProductFirebase>> mProducts;
Map<String, Ids> mIds;
Ids对象应包含:
Map<String, Boolean> mIds;
现在,通过这种结构,您可以获得数据,您已经做过的事情:
Data data = dataSnapshot.getValue(Data.class);
我希望这能解决你的问题。
<强>更新强>
在这种情况下,您可以将密钥存储在单独的节点中,并在其中存储具有此密钥的列表的ID。在你的情况下,你将拥有:
"keys": {
"8ada6af0-de37-495d-8349-0cd4c215fc87": {
"list1": true,
"list3": true
},
...
}
首先,您查询获取“keys / 8ada6af0-de37-495d-8349-0cd4c215fc87”节点的内容,然后再进行另一次查询以获取这些列表。
Here你可以找到一个关于如何进行此类查询的好教程。