2016-07-04 8 views
2

Я использую alamofire для получения ответа JSON с сервера, а затем с помощью ObjectMapper для сопоставления строки с объектом Realm.Объект Realm + Swift с строкой 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) сохраняет 0 вместо 10 или 9 (устанавливается в 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

См. Мое обновление. Будет ли это работать? Используя настраиваемые устройства, вы убедитесь, что составной код всегда обновляется. 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 есть орфографическая ошибка: "realtedInfo". Поэтому я бы рекомендовал двойную проверку, которая тоже работает. :)