【问题标题】:Android Firebase : Update/Add record in Nested Array dataAndroid Firebase:在嵌套数组数据中更新/添加记录
【发布时间】:2020-04-25 00:31:55
【问题描述】:

我被困在 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 数据库的图像。

【问题讨论】:

  • 我们需要更新数组中的数组请给出这个问题的解决方案
  • @AlexMamo:虽然您链接的问题显示了类似的问题,但开发人员了解如何将其应用于他们自己的问题通常会有所帮助。我强烈建议在关闭骗子时发表评论,说明如何将链接的答案应用于他们的问题。我也不相信链接的答案是所有案例的最佳答案。将子元素存储在子集合中是一种有效的方法,但将它们存储在同一个文档中也是有效的。我投票重新提出这个问题,允许其他人用如何更新嵌套/数组字段的实际代码来回答。
  • @FrankvanPuffelen 是的,不发表评论是我的错,我通常会这样做。现在,我刚刚回答了这个问题,并提供了有关此特定用例的一些详细信息。但是,将子元素存储在子集合中只是初始解决方案之外的另一种解决方案。再次感谢 puf。

标签: android arrays firebase kotlin google-cloud-firestore


【解决方案1】:

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

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

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

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

编辑:

根据您的评论:

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

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

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

【讨论】:

  • 因此我们需要将菜单数组制作为 HashMap 列表并进行更改并将菜单写回文档。
  • 有没有其他方法可以在其他 ArrayList 中更新特定 ArrayList 的项目?
  • @JenisKasundra 这就是你需要的方式。如果在menu 数组中是字符串,那么 OP 可以将该数组作为 List 获取。在那种特殊情况下,他也可以使用FieldValue.arrayUnion,但不能在这个用例中使用。
  • @JenisKasundra 目前没有其他办法。
  • @AlexMamo 在我的情况下,我在嵌套数组的列表中有超过 5000 条记录,因此,要更新 5000 多条记录中的单个记录,这样做是个好主意吗?请你能用android代码语法更清楚地说明如何实现这些吗? firebase 处理大量数据非常复杂,有没有简单的方法来处理它?
猜你喜欢
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 2018-02-01
相关资源
最近更新 更多