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

Мне нужно получить значения ключей из моей базы данных в Firebase и добавить в массив.Это мой запрос:

let dbHandle = Database.database().reference().child("userRecords").child(uid).queryOrdered(byChild: self.startDate).queryEnding(atValue: self.finishDate)
        dbHandle.observeSingleEvent(of: .value, with: { (snapshot) in
            guard let foundRecords = snapshot.children.allObjects as? [DataSnapshot] else {return}
            for record in foundRecords{
                let recordName = record.childSnapshot(forPath: "recordName").value as! String
                let recordTime = record.childSnapshot(forPath: "timestamp").value as! String
                let recordRate = record.childSnapshot(forPath: "recordRate").value as! String
                self.records.append(["equipment": recordName as AnyObject,"date": recordTime as AnyObject, "rate": recordRate as AnyObject])
            }

Это моя структура базы данных:

Snap (record1) {
"-LUmY5jC-jC6vwpQj26S" =     {
    recordName = "record1";
    recordRate = "1.2";
    timestamp = "27/12/2018 at 01:59";
};
"-LUmaAcxLcz1Oif4-L8n" =     {
    recordName = "record1";
    recordRate = "1.0";
    timestamp = "25/12/2018 at 02:15";
};}

JSON:

{"userRecords" : {
"l1GIK43GCUbdnnyYsrQnO3JLnjV2" : {
  "record1" : {
    "-LUmY5jC-jC6vwpQj26S" : {
      "recordName" : "record1",
      "recordRate" : "1.2",
      "timestamp" : "27/12/2018 at 01:59"
    },
    "-LUmaAcxLcz1Oif4-L8n" : {
      "recordName" : "record1",
      "recordRate" : "1.0",
      "timestamp" : "25/12/2018 at 02:15"
    }
  },
  "record2" : {
    "-LUmY7GRwo6_Iq6IqbN_" : {
      "recordName" : "record2",
      "recordRate" : "1.1",
      "timestamp" : "27/12/2018 at 01:59"
    },
    "-LUmaAcr1P2mQrtSdFWi" : {
      "recordName" : "record2",
      "recordRate" : "1.2",
      "timestamp" : "25/12/2018 at 02:15"
    }
  }
}

},}

запрос выдает "Поток 1: сигнал SIGABRT".Все объекты правильно подключены.Когда я изменяю запрос на:

 dbHandle.observeSingleEvent(of: .childAdded, with: { (snapshot) in

Запрос работает нормально.

Результаты добавляются в мой массив "records" и затем сохраняются в словаре обратно в Firebase:

let reportsRef = Database.database().reference().child("reports").child(uid)
            let reportDict = ["reportNumber": reportNumber, "company": self.companyTxtField.text!, "address": self.addressTxtField.text!, "start": self.startDate, "finish": self.finishDate, "records": self.records] as [String : Any]
            reportsRef.childByAutoId().setValue(reportDict)

Проблемы:

  1. Я получаю значениядобавляется в мой массив только из "record1", хотя есть также и "record2", по крайней мере.Как я могу получить все значения из всех объектов в "foundRecords" и добавить значения в массив records: [[String: AnyObject]]?
  2. Почему "наблюдающий единый случай (из: .value" выдает ошибку?

* значения меток времени не были преобразованы в формат NSDate для демонстрационных целей

1 Ответ

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

У вас есть дополнительный уровень в JSON под каждым UID, который ваш код не обрабатывает.Когда вы наблюдаете .childAdded, это не проблема, так как ваш обработчик завершения вызывается для каждого отдельного ребенка.Но когда вы наблюдаете .value, вам звонят со снимком для всех детей.А это значит, что вы должны сами пройти дополнительный уровень:

let dbHandle = Database.database().reference().child("userRecords").child(uid)
    .queryOrdered(byChild: "timestamp").queryStarting(atValue: self.startDate).queryEnding(atValue: self.finishDate)
dbHandle.observeSingleEvent(of: .value, with: { (snapshot) in
  guard let foundRecords = snapshot.children.allObjects as? [DataSnapshot] else {return}
  for record in foundRecords {
    let recordName = record.childSnapshot(forPath: "recordName").value as! String
    let recordTime = record.childSnapshot(forPath: "timestamp").value as! String
    let recordRate = record.childSnapshot(forPath: "recordRate").value as! String
    self.records.append(["equipment": recordName as AnyObject,"date": recordTime as AnyObject, "rate": recordRate as AnyObject])
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...