繁体   English   中英

Firebase Android Android-将具有不同结构的datasnapshot子级映射到Java对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM