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

问题描述 投票:0回答:1

我在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

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

java android json firebase firebase-realtime-database
1个回答
1
投票

你应该重构一下你的数据库。你应该将那些值为true的节点放入一个单独的节点(我在这里称它为ID)。同样对于list1,list2,...节点,您应该创建父节点。例如:

"lists": {
  "list1": {
    "category": "food",
    ...
  },
  "list2": {
    ...
  },
  ...
},
"ids": {
  "8ada6af0-...": true,
  ...
}

现在,如果您创建另一个自定义对象(让它成为数据),其中包含:

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

© www.soinside.com 2019 - 2024. All rights reserved.