Firebase数据库Android - 将具有不同结构的datasnapshot子映射到java对象

时间:2018-03-01 09:33:29

标签: java android json firebase firebase-realtime-database

我在Firebase数据库中有这些数据。

enter image description here

我想要做的是将这个子(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个,这取决于共享列表的人数。

提前致谢

更新:

enter image description here

这是一般情况。我想查询有关键的所有列表&#34; 8ada6af0-de37-495d-8349-0cd4c215fc87&#34;。 所以我期待收到list1和list3。它是!!但现在我遇到了我在本主题第一部分中描述的原始问题。

1 个答案:

答案 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你可以找到一个关于如何进行此类查询的好教程。