2016-07-04 4 views
2

私はalamofireを使用してサーバーから応答JSONを取得し、ObjectMapperを使用して文字列をRealmオブジェクトにマップします。Realm + JSON文字列でスウィフト更新オブジェクト

The realm object is: 
    class SolutionVideo: Object, Mappable { 

dynamic var svID = 0 
dynamic var solutionTitle = "" 
dynamic var videoName = "" 
dynamic var relatedInfo = "" 
dynamic var shortDesc = "" 

override static func primaryKey() -> String? { 
    return "svID" 
} 

required convenience init?(_ map: Map) { 
    self.init() 
} 

func mapping(map: Map) { 
    svID <- map["svID"] 
    solutionTitle <- map["solutionTitle"] 
    videoName <- map["videoName"] 
    relatedInfo <- map["relatedInfo"] 
    shortDesc <- map["shortDescription"] 
} 

}

The json string is: 
    [ 
    { 
     "svID": "10", 
     "solutionTitle": "Video10", 
     "videoName": "Video10", 
     "realtedInfo": "", 
     "shortDescription": "" 
    }, 
    { 
     "svID": "9", 
     "solutionTitle": "Video9", 
     "videoName": "Video9", 
     "realtedInfo": "", 
     "shortDescription": "" 
    } 
    ] 



    in my viewController: 
     @IBAction func updateBtn(sender: AnyObject) { 
    // download file to update Realm 
    let url = "http://janicedemo.com/updates.json" 
    Alamofire.request(.GET, url).responseArray { (response: Response<[SolutionVideo], NSError>) in 
     let Array = response.result.value 
     print(Array) 
     if let Array = Array { 
      for video in Array { 
       let dbURL = Realm.Configuration.defaultConfiguration.fileURL 
       let realm = try! Realm(fileURL: dbURL!) 
       try! realm.write{ 
        print("will save") 
        realm.add(video, update: true) 
       } 
      } 
     } 
    } 

問題は、私は成功したオブジェクトを追加することができるということです。しかし、svID(primark key)は10または9の代わりに0を保持します(JSONで設定)。私はsvIDにデフォルト値を設定しているのですか?誰かが私にヒントを与えることができますか?おかげ

+0

既にAlamofireObjectMapper拡張機能を使用していますか? – LNI

+0

はい、私はすでにそれを使用しています:) –

答えて

1

class SolutionVideo: Object, Mappable { 

dynamic var svID = 0 
dynamic var solutionTitle = "" 
dynamic var videoName = "" 
dynamic var relatedInfo = "" 
dynamic var shortDesc = "" 

func setCompoundID(id: Int) { 
    self.svID = svID 
    compoundKey = compoundKeyValue() 
} 

func setCompoundID(id: Int) { 
    self.solutionTitle = solutionTitle 
    compoundKey = compoundKeyValue() 
} 

func setCompoundID(id: Int) { 
    self.videoName = videoName 
    compoundKey = compoundKeyValue() 
} 

func setCompoundID(id: Int) { 
    self.relatedInfo = relatedInfo 
    compoundKey = compoundKeyValue() 
} 

func setCompoundID(id: Int) { 
    self.shortDesc = shortDesc 
    compoundKey = compoundKeyValue() 
} 


dynamic lazy var compoundKey: String = self.compoundKeyValue() 

override static func primaryKey() -> String? { 
return “compoundKey” 
} 

func compoundKeyValue() -> String { 
    return "\(svID)\(solutionTitle)\(videoName)\(relatedInfo)\(shortDesc)” 
} 

} 
+0

私はAlamofireObjectMapperを使用しています、それはalamofireとobjectmapperを組み合わせています。 –

+0

私の更新を参照してください。それは働くだろうか?カスタムセッターを使用すると、compoundKeyが常に更新されていることが確認されます。 lazy varは、あなたが設定したものから取得されるプロパティに初めてアクセスすることを保証します。 – tymac

+0

それは正しくありません。私はそれをマップしようとすると、それはエラーをスローする、そのsvIDはget-onlyです –

0

私は考えることができる主なものは、主キーの値ではなく(すなわち、"10"代わりに単に10の)適切な整数の文字列として降りてくることを試してみてください。それはちょうど0

According to the ObjectMapper documentationをデフォルトですので、あなたのマッピング機能では、この変換をインラインで実行できるようにする必要があり、マッパーは整数に文字列の変換を処理するのに十分にスマートではない可能性があります:

svID <- (map["svID"], TransformOf<Int, String>(fromJSON: { Int($0!) }, toJSON: { $0.map { String($0) } })) 

また、サイドノートとして、あなたのJSONキー名の1つにスペルミスがあることに気付きました:"realtedInfo"。だから、私もダブルチェックをすることをお勧めしたいと思います。 :)

関連する問題