Swift устанавливает значение словаря Firebase с помощью словарей - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть объект, в котором есть массив подчиненных объектов.Я хочу сохранить этот объект в базе данных Firebase как есть.Как я могу сделать этот процесс сохранения в swift?

Я пытался создать новые словари

-LQTDo9OU9zw84IKnnW3
     code: "111"
     date: "4/11/2018"
     dateAndTime: "2018/11/4/12/18"
     description: "Description"
     editor: "Burak Akdeniz"
     predictions
          -0
            prediction: "Maç Sonucu 1"
            predictionRatio: "2"
    startTime: "12 : 18 PM"
    status: "Waiting"



let newMatchRef = refMatches.child("platinium").childByAutoId()
            let m : Dictionary<String, AnyObject> = [
            "code": match.code as AnyObject,
            "date": match.date as AnyObject,
            "dateAndTime": match.dateAndTime as AnyObject,
            "description": match.description as AnyObject,
            "editor": match.editor as AnyObject,
            "league": match.league as AnyObject,
            "matchType": match.matchType as AnyObject,
            "predictions": , //<--- HERE I have a predictions array includes prediction objects. This is the point I get error.
            "startTime": match.startTime as AnyObject,
            "status": match.status as AnyObject,
            "team1": match.team1 as AnyObject,
            "team2": match.team2 as AnyObject]
            print(newMatchRef)
            newMatchRef.setValue(m)

Мне нужно сохранить этот объект в базе данных firebase с его подузлами

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Ключом к Firebase является всегда думать о родительских и дочерних узлах как пары ключ: значение.Ключи всегда являются строками, но значения могут быть строками, числами, логическими значениями и массивами.

В этом случае вы в значительной степени поняли все правильно, просто нужно считать массив самим значением.

Давайте определим этот массив с двумя элементами (каждый элемент является словарем)

    let myArray = [
        ["prediction": "pred 0",
         "predictionRatio": "2"],

        ["preduction": "pred 1",
         "predictionRatio": "3"]
    ]

, затем давайте создадим объект словаря, который содержит пары ключ: значение, и запишем все это в firebase.

    let dict:[String: Any] = [
        "code": "1111",
        "date": "04/11/2018",
        "description": "Description",
        "predictions": myArray
    ]

, а затем запишите его в ссылку, созданную с помощью .childByAutoId

    let ref = self.ref.child("some_node").childByAutoId()
    ref.setValue(dict)

, а результаты в some_node будут выглядеть следующим образом

child_by_auto_id_0
   code: "1111"
   date: "04/11/2018"
   description: "some description"
   predictions:
      0:
         "prediction": "pred 0"
         "predictionRate": "2"
      1:
         "prediction": "pred 1"
         "predictionRate": "3"

Обратите внимание, что я сказалсловарь, который будет получать пары ключ: значение String: Any.Ключи, как упоминалось выше, всегда являются строками, но в этом случае некоторые значения являются строками, а затем одним является массив.Любой тип обрабатывает это.

При этом, как правило, лучше всего избегать массивов в Firebase.С ними сложно работать, их нелегко обслуживать, и они хорошо выполняют запросы ... им просто не нравится, когда их запрашивают.Было бы лучше генерировать ключи для массива, используя тот же метод .childByAutoId.Это гораздо более гибко.

   predictions:
      auto_id_0:
         "prediction": "pred 0"
         "predictionRate": "2"
      auto_id_1:
         "prediction": "pred 1"
         "predictionRate": "3"

В этой заметке вы можете рассмотреть возможность денормализации вашего узла предсказаний, если вы все захотите запросить их

child_by_auto_id_0
       code: "1111"
       date: "04/11/2018"
       description: "some description"

predictions
      auto_id_0:
         "prediction": "pred 0"
         "predictionRate": "2"
         "parent_node_ref": "child_by_auto_id_0"
      auto_id_1:
         "prediction": "pred 1"
         "predictionRate": "3"
         "parent_node_ref": "child_by_auto_id_0"
0 голосов
/ 27 декабря 2018

Я предполагаю, что все остальное в порядке с текущей реализацией, что если вы замените строку прогноза на:

"predictions": match.predictions as [[String: String]]

Если приведенный выше код не имеет смысла или не работает, пожалуйста, отредактируйте ваш вопроси показать массив прогнозов и структуру данных прогноза.

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