【问题标题】:Save json dictionary to core data Swift 3将json字典保存到核心数据Swift 3
【发布时间】:2017-09-20 12:07:15
【问题描述】:

我能够使用可转换键值将 json 数组中的最后一个访客字典值作为字典保存到核心数据中,但是其他访客字典值没有保存。来宾现在也是实体,但我希望将来宾保存为字典,因为此任务不需要复杂的关系。我确定我正在查看 json,reservation.guest 的值类型 = [AnyHashable: Any]?任何建议都会有帮助,这里是我的 json 回复 https://pastebin.com/J28myW66,谢谢

注意:对 HTTP 请求使用 Alamofire。也没有包括我的整个班级,因为这是它的主要部分。 Reservation 和 Guest 都是 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)

                }

【问题讨论】:

    标签: ios json swift core-data swifty-json


    【解决方案1】:

    当您的代码启动时,您创建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 = ... 行。

    【讨论】:

    • 谢谢你和很好的解释。不敢相信我错过了!
    【解决方案2】:

    首先,您需要使设计流程有点通用,即 HTTP 请求/响应、数据库部分、模型部分和 UI 部分。

    现在为您的响应创建一个通用模型类, 这样这些值将绑定在单个对象中。 在您的核心数据子类中,您的表即自定义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

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 2017-05-14
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多