![](/img/trans.png)
[英]Android Studio Firebase Database DataSnapshot returning null
[英]Firebase database Android - mapping datasnapshot child with different structure to java object
我在Firebase数据库中有这些数据。
我想做的是将此子对象(list1)映射到java对象上。 当我只想要list1的子代时,我可以使用类似以下的方法将它们映射到自定义对象(例如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个,这取决于共享列表的人数。
提前致谢
更新:
这是一般情况。 我想查询所有有关键字“ 8ada6af0-de37-495d-8349-0cd4c215fc87”的列表。 因此,我希望收到list1和list3。 而且是! 但是现在我遇到了本主题第一部分中描述的原始问题。
您应该重构一下数据库。 您应该将值正确的那些节点放在单独的节点中(我在这里将其称为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”节点的内容,然后进行另一次查询以获取这些列表。
在这里,您可以找到有关如何进行此类查询的出色教程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.