2017-04-23 98 views
0

我能夠使用可變換的鍵值將字符串數組中的最後一個客戶字典值保存到核心數據中,但是其他客戶字典值未保存。客人也是現在的實體,但我希望將客人保存爲字典,因爲此任務不需要複雜的關係。我敢肯定,我期待通過JSON,值類型reservation.guest = [AnyHashable: Any]?任何建議將是有益的,這裏是我的JSON響應https://pastebin.com/J28myW66,感謝將json字典保存爲核心數據Swift 3

注意:在使用Alamofire的HTTP請求。因爲這是它的主要部分,所以也沒有包括我的整個班級。預訂和客戶都NSManagedObject類

let managedObjectContext = CoreDataManager.shared.persistentContainer.viewContext 

    let reservationEntityDescription = NSEntityDescription.entity(forEntityName: "Reservation", in: managedObjectContext) 
    let guestEntityDescription = NSEntityDescription.entity(forEntityName: "Guest", in: managedObjectContext) 

    let reservation = Reservation(entity: reservationEntityDescription!, insertInto: managedObjectContext) 
    let guest = Guest(entity: guestEntityDescription!, insertInto: managedObjectContext) 


    let url = "\(serverEndpoint)\(path)" 

    manager?.request(
     url 
     ).responseJSON { responseData in 

      if(responseData.result.error != nil) { 

       print(responseData.response) 
      } 
      else if responseData.result.value != nil{ 


       let json = JSON(responseData.result.value!) 

       let content = json["data"] 

        var reservationArray: [String] = [] 
        if let dates = content.array { 
         for item in dates { 
          if let str = item["date_time"].string { 
           reservationArray.append(str) 
           print(reservationArray) 
          } 
         } 

        } 

        for (key,obj) in content { 

         let guestData = obj["guest"] 
         let guestDict = guestData.dictionaryObject! 

         reservation.guest = guestDict 
         reservation.id = obj["id"].stringValue 
         reservation.dateTime = obj["date_time"].date 
         reservation.startTime = obj["start_time"].time 
         reservation.numOfPeople = obj["number_of_people"].intValue as NSNumber? 
         reservation.status = obj["status"].stringValue 
         reservation.tables = obj["tables"].arrayObject as! [NSString]? 
         reservation.reservationCollections = reservationArray as [NSString]? 

         guest.id = guestData["id"].stringValue 
         guest.email = guestData["email"].stringValue 
         guest.name = guestData["full_name"].stringValue 
         guest.phone = guestData["phone"].stringValue 
         guest.notes = guestData["notes"].stringValue 

        } 
        print("Reservation to be saved\(reservation)") 
        print("Guest to be saved: \(guest)") 
      } 
     } 

       do { 
        try reservation.managedObjectContext?.save() 

        } catch let error as NSError { 

         fatalError(error.localizedDescription) 

        } 

       do { 
        try guest.managedObjectContext?.save() 

       } catch let error as NSError { 

        fatalError(error.localizedDescription) 

       } 

回答

2

當你的代碼開始,你創建的Guest一個實例和實例Reservation之一

let reservation = Reservation(entity: reservationEntityDescription!, insertInto: managedObjectContext) 
let guest = Guest(entity: guestEntityDescription!, insertInto: managedObjectContext) 

之後,你永遠不會創建任何其他實例。在你的循環,你將值分配給該實例:

reservation.guest = guestDict 
reservation.id = obj["id"].stringValue 
... 

guest.id = guestData["id"].stringValue 
guest.email = guestData["email"].stringValue 
... 

但由於只有一個實例,只有最後一次循環得到保存。在循環中第一次將值賦給guestreservation。每隔一段時間,用新的值覆蓋以前的值。

如果您希望每次通過循環都保存一個新實例,則需要每次創建新實例。在循環內移動let guest = ...let reservation = ...行。

+0

謝謝你,很好的解釋。不能相信我錯過了! –

0

首先,你需要做的設計流程位通用即HTTP請求/響應,數據庫部分,型號部件和用戶界面的一部分。

現在爲您的響應創建一個通用模型類, ,以便值綁定到單個對象中。 在你的核心數據子類你的表,即定製NSManagedObject類。

首先將字典對象[對象content.array]轉換爲相應的模型類對象。

在這種SBPlayer是一個模型類

Favourite+CoreDataProperties.swift & Favourite+CoreDataClass.swift是定製NSManagedObject類(自動生成的)。

現在,使用每個對象,您都映射了數據庫表中和自定義類NSManagedObject類中的各個屬性。

映射值並保存它的數據庫。

例如:https://github.com/Abhishek9634/ScoreBoard/blob/master/ScoreBoard/ScoreBoard/SBDBManager.swift

參考https://github.com/Abhishek9634/ScoreBoard