2017-04-23 8 views
0

変換可能なキー値を使用してコアデータに保存されたjson配列の最後のゲスト辞書値を取得できますが、他のゲスト辞書値は保存されません。ゲストは今でもエンティティですが、このタスクは複雑な関係を必要としないため、ゲストを辞書として保存したいと考えていました。私はjsonを見ていると思いますが、reservation.guest = [AnyHashable: Any]?の値のタイプは、私のjsonの応答https://pastebin.com/J28myW66です。ありがとうjson辞書をコアデータに保存するSwift 3

注:HTTPリクエストにはAlamofireを使用しています。これが私のクラスの主要部分であるので、私のクラス全体をここに含めていない。予約やユーザーレビューの両方NSManagedObjectクラスは、デザイン・フロー・ビットの汎用すなわちHTTPリクエスト/レスポンス、データベース部、機種部品およびUI部品を作成する必要があります。まず

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

あなたのコードが起動したら、あなたはReservationGuestとインスタンスの1つののインスタンスを作成:

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 
... 

しかし、インスタンスが1つしかないので、ループの最後のパスだけが保存されます。最初のループでは、値をguestreservationに割り当てます。たびに、前の値を新しい値で上書きします。

ループを通過するたびに新しいインスタンスを保存する場合は、毎回新しいインスタンスを作成する必要があります。ループ内にlet guest = ...let reservation = ...行を移動します。

+0

ありがとうと素敵な説明。私はそれを逃したと信じられない! –

0

です。

応答の汎用モデルクラス を作成し、値が単一オブジェクトにバインドされるようにします。 あなたのコアデータサブクラスであなたのテーブル、つまり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

関連する問題