Android Firebase: обновление / добавление записи в данные Nested Array - PullRequest
2 голосов
/ 07 января 2020

Я застрял в одном случае операции с пожарной базой в android. Мое требование:

У меня есть таблица Named: "Значения" Эта таблица значений содержит данные следующего типа.

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

Теперь я хочу обновить идентификатор: 123 с именем = "test5" Как обновить этот вложенный объект массива в базе данных firebase в android?

Я попытался выполнить следующее, но он обновляет / добавляет весь массив меню, а не объект массива продукта перкулярно.

Я просто хочу обновить в объекте массива продукта.

Ниже приведен код, который я пробовал, но он обновляет весь массив меню.

      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))

, то получение вопроса / или точка не допускается. у меня есть последний файл Gradle Firebase.

Как обновить конкретную позицию объекта продукта? Пожалуйста, кто-нибудь может помочь мне решить это?

Образ базы данных Firebase.

enter image description here

1 Ответ

3 голосов
/ 07 января 2020

Решение этой проблемы можно найти в моем ответе из следующего поста:

Есть немного меньшая разница. Однако для вашего случая использования обратите внимание, что документ, который вы предоставили нам в качестве примера, содержит свойство с именем menu, имеющее тип array. В этот массив вы добавили несколько объектов, которые содержат два свойства: свойство String с именем category и массив с именем product. Этот массив содержит в терминах два других свойства, одно из которых id, а другое - name, оба типа String.

Ни один из этих массивов не может быть обновлен с помощью FieldValue.arrayUnion(map). Единственный доступный вариант - получить массив menu в виде списка HashMap<String, Any>. Если у вас есть эта карта, вы можете просто пройти по ней и получить нужные данные.

Таким образом, чтобы обновить значение свойства внутри Map, вы должны сначала получить карту, внести изменения и поместить его обратно. В конце концов, после того, как вы сделали все необходимые изменения, запишите документ обратно в Firestore.

Редактировать:

Согласно вашему комментарию:

В моем случае у меня более 5000 записей в списке с вложенным массивом.

Трудно поверить, что вы можете вложить 5000 элементов в один документ, потому что он может не помещаться поскольку максимальный размер для документа составляет 1 МБ (1 048 576 байт). Пожалуйста, смотрите использование и ограничения . Таким образом, вложение 5000 объектов в массив не является решением вообще. В этом случае единственное решение, которое у вас есть, это использовать вложенную коллекцию и добавить каждый элемент из массива в качестве документа. В этом случае ограничений нет.

В заключение, единственный масштабируемый способ хранения неизвестного большого списка элементов - это использование документов в коллекции. Поля типа массива не масштабируются для списков, которые постоянно растут, потому что элементы в конечном итоге превысят этот (1 МиБ), что, очевидно, вызовет проблемы в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...