首页 > 解决方案 > Android Firebase:在嵌套数组数据中更新/添加记录

问题描述

我被困在android中的一种firebase操作案例中。我的要求:

我有一个名为:“值”的表,这个值表包含以下类型的数据。

  {
    "menu": [
             {
               "category": "cocktails",
               "product": [
                            {
                              "id": "123",
                              "name": "test1"
                            },
                            {
                              "id": "456",
                              "name": "test2"
                            }
                          ]
            },
            {
               "category": "vodka",
               "product": [
                            {
                               "id": "789",
                               "name": "test3"
                             },
                             {
                                "id": "901",
                                "name": "test4"
                             }
                         ]
              }
           ]
       }

现在,我想用 name = "test5" 更新 id : 123,如何在 android 的 firebase 数据库中更新这个嵌套数组对象?

我尝试了以下操作,但它更新/添加了整个菜单数组而不是特定的产品数组对象。

我只想更新产品数组对象。

以下是我尝试过的代码,但它更新了所有菜单数组。

      val listPorduct = ArrayList<HashMap<String, Any>>()

      for ((i, product) in productList.withIndex()) {

            var productMap = HashMap<String, Any>()

              productMap = hashMapOf(
                "id" to "123",
                "name" to "test5")

             listPorduct.add(productMap)
       }

        val map = hashMapOf<String, Any>()
        map.put("category", list[position].category)
        map.put("product", listPorduct)

       repository.getTabs().update("menu", FieldValue.arrayUnion(map))

如果我尝试

       repository.getTabs().update("menu/product", FieldValue.arrayUnion(map))

       or

       repository.getTabs().update("menu.product", FieldValue.arrayUnion(map))

然后出现问题/不允许点。我有最新的 firebase gradle 文件。

如何更新产品对象的特定位置?请问有人可以帮我解决这个问题吗?

Firebase 数据库的图像。

在此处输入图像描述

标签: androidarraysfirebasekotlingoogle-cloud-firestore

解决方案


这个问题的解决方案可以在我从以下帖子的回答中找到:

有一个稍小的差异。但是,对于您的用例,请注意您作为示例提供给我们的文档包含名为menu数组类型的属性。在这个数组中,您添加了一些包含两个属性的对象,一个名为 String 的属性category和一个名为 的数组product。这个数组包含另外两个属性,一个是 the id,另一个是 the name,两者都是 String 类型。

这些数组都不能使用FieldValue.arrayUnion(map). 您唯一的选择是将menu数组作为HashMap<String, Any>. 一旦你有了这张地图,你就可以简单地遍历它并获得所需的数据。

因此,要更新 a 中属性的值Map,您应该首先获取地图,进行更改并将其放回原处。最后,在完成所有必要的更改后,将文档写回 Firestore。

编辑:

根据您的评论:

在我的例子中,我在一个带有嵌套数组的列表中有超过 5000 条记录。

很难相信您可以将 5000 个元素嵌套到单个文档中,因为它可能不适合,因为文档的最大大小为 1 MiB(1,048,576 字节)。请参阅用法和限制。所以将 5000 个对象嵌套到一个数组中根本不是一个解决方案。在这种情况下,您拥有的唯一解决方案是使用子集合并将数组中的每个项目添加为文档。在这种情况下,没有限制。

作为结论,存储未知大型项目列表的唯一高度可扩展的方法是使用集合中的文档。数组类型字段不适用于不断增长的列表,因为项目最终将超过 (1 MiB),这显然会在未来引起问题。


推荐阅读