2017-04-23 47 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