У меня есть struct с разными типами данных, и я хотел бы записать его в Firebase. Некоторые свойства моей структуры могут быть нулевыми, поэтому они должны быть записаны в базу данных.

Как мне обрабатывать нулевые значения при записи в Firebase?

 struct Booking{

  let bookingNumber:String
  let bookingCompleted:Bool
  let cancelledBy:[String:AnyObject]?

       init(bookingNumber:String,
          bookingCompleted:String){
         self.bookingNumber = bookingNumber
         self.bookingCompleted = bookingCompleted
        }

      init(cancelledBy:[String:AnyObject]){
           self.cancelledBy = cancelledBy
        }
}

class DisbursePayment {

   override func viewDidLoad() {
    super.viewDidLoad()
   //how to handle if cancelledBy is nil? It will throw error :  unexpectedly 
   //found nil while unwrapping an Optional value
   //How should I structure my data in `struct Booking`?
   let item = Booking(cancelledBy: valueCouldBeNil)  
  }
}
2
bibscy 15 Дек 2017 в 04:12

1 ответ

Лучший ответ

Из комментариев кажется, что вы уже нашли решение, я хотел бы добавить следующую информацию для других в качестве справки:

Вы не должны хранить значения nil в firebase (или любой другой базе данных, если на то пошло, поскольку это нарушает 1NF для повторяющихся значений), если значение не требуется, его следует устанавливать в базу данных, только если она существует. В противном случае инициализируйте его как nil и используйте Optional Chaining, чтобы безопасно развернуть значение, если оно существует.

Рассмотрим следующий объект, который инициализирует необязательное свойство title равным нулю.

Class CustomObject: NSObject {
     //…
     var title: String? = nil
     //…
}

Настройка

При установке значения в firebase мы можем использовать необязательную цепочку, чтобы установить значение, если оно существует, в противном случае не добавляйте его к значениям, которые должны быть сохранены в ссылке на дочерний объект в firebase, и удаляйте текущее значение, если оно существует.

   //Create a new reference to Firebase Database
   var ref: DatabaseReference!
   ref = Database.database().reference().child(<#your child id#>)

    //Make a Dictionary of values to set
    var values:[String:Any] = [:]

    //Set required values like uuid or other primary key

    //Use Optional Chaining to set the value
    //Note that if title is nil 
    //it doesn’t override any existing value in firebase for title i.e. the old value will still remain.
    if let title = myObject.title {
            values["title"] = title
          } else {
            //if the value was previously set but now is not, 
            //we should update firebase by removing the value.
            ref.child("title").removeValue()
         }

    //…

    //Finally, push the remaining values to firebase to up date the child
    ref.updateChildValues(values)

Получение

Чтобы получить значение из firebase, мы снова используем Optional Chaining, чтобы увидеть, существует ли значение для данного ключа, здесь я обращаюсь к объекту по его дочернему пути, ваш запрос может быть другим, но концепция та же.

    //Create a new reference to Firebase Database
    var ref: DatabaseReference!
    ref = Database.database().reference().child(<# child path #>)
    ref.queryOrderedByValue().observeSingleEvent(of: .value) { (snapshot) in
            if (snapshot.value is NSNull) {
                print("No Items to Fetch")
            } else  {
                //enumerate over the Objects
                for child in snapshot.children.allObjects as! [DataSnapshot] {
                    if let object = child.value as? [String : AnyObject] {

                           let myObject = CustomObject()

                            if let title = object["title"] as? String {
                                   myObject.title = title
                              }
                               //If There is no value for 'title' it will not be set.
                               //…


//Then use the value as you normally would…
if (myObject.title != nil) {//..}
1
RLoniello 15 Дек 2017 в 03:47