Записывайте несколько словарей в базу данных Firebase Realtime одновременно с помощью Swift, используя childByAutoId () - PullRequest
0 голосов
/ 27 апреля 2020

Я создаю приложение (Swift), в котором пользователь может выбрать CSV-файл, содержащий банковские транзакции. Я хочу проанализировать этот CSV в моей базе данных Firebase Realtime.

Входной файл CSV будет:

amount, label
111, Uber Eats
1678, iTunes

Вывод в базу данных реального времени будет:

{
  "user ID 1" : {
    "-M5wUNXgmTuBgZpvT0v-" : {
      "amount" : 111,
      "label" : "Uber Eats"
    },
    "-M5wUQk4wihb3OxcQ7SX" : {
      "amount" : 1678,
      "label" : "iTunes"
    }
  },
  "user ID 2" : {
    "-M5wUNXgmTuBgZpvT0k-" : {
      "amount" : 111,
      "label" : "Deliveroo"
    }
  }
}

В этом примере я «пользователь ID 1», и я загрузил две транзакции из файла CSV.

Я не могу понять, как массово записать эти строки в Firebase за один раз.

Я пытался разобрать CSV в несколько словарей и записать в Firebase в виде массива:

let myParsedCSVasArray = [
        ["amount": 111,
         "label": "Uber Eats"],

        ["amount": 1678,
         "label": "iTunes"]
    ]


self.ref.child(user!.uid).childByAutoId().setValue(myParsedCSVasArray)

Но результат не соответствует моим потребностям, поскольку он создает массив внутри JSON: Результат предыдущего кода в базе данных реального времени Firebase

Есть идеи, как можно загрузить несколько словарей одновременно и добавить childByAutoId к каждому из них?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Я использую Dart, а не Swift, поэтому не могу легко показать правильный код. Хотя я могу описать этот принцип.

Чтобы гарантировать, что все данные будут записаны, вы должны выполнить набор или обновить как одно действие базы данных. Поэтому вам нужно построить словарь (карту в моих терминах), который содержит все ваши записи. Каждая запись должна иметь уникальный ключ, сгенерированный Firebase. Вам нужно использовать al oop для создания этого словаря. В l oop для каждой записи необходимо получить уникальный ключ, используя код, подобный этому let key = ref.child("posts").childByAutoId().key. Каждый вызов этого будет возвращать новый уникальный ключ.

Когда словарь заполнен, вы добавляете его как одно обновление атома c (либо все работает, либо все выходит из строя).

Этот код Swift, кажется, делает это для одной записи, поэтому вы должны иметь возможность использовать его в качестве основы для l oop:

guard let key = ref.child("posts").childByAutoId().key else { return }
let post = ["uid": userID,
            "author": username,
            "title": title,
            "body": body]
let childUpdates = ["/posts/\(key)": post,
                    "/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates) 

Надеюсь, что это поможет.

См. Эту ссылку для получения дополнительной информации: https://firebase.google.com/docs/database/ios/read-and-write

0 голосов
/ 27 апреля 2020

Вы можете решить это, используя for loop, перечислив коллекцию, как показано ниже

let myParsedCSVasArray = [
    ["amount": 111,
     "label": "Uber Eats"],

    ["amount": 1678,
     "label": "iTunes"]
]

for value in myParsedCSVasArray {
    ref.child(user!.uid).childByAutoId().setValue(value)
}

Для ссылки на циклы в Swift см. Эту ссылку

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