2013-02-13 3 views
2

URL에서 데이터를 가져옵니다. 데이터가 JSON 형식으로 제공됩니다. JSON을 Core Data의 문자열로 저장하려고합니다. 내가 어떻게 할 수 있니? 핵심 데이터가 NSString 아닌 NSDictionary 기대로 (내 JSON가있는 NSDictionary 객체이고 그것을 실행 한 후 그JSON을 코어 데이터의 문자열로 저장합니다.

Terminating app due to uncaught exception 'NSInvalidArgumentException',reason:'Unacceptable type of value for attribute: property = "cat_list"; desired type = NSString; given type = __NSCFDictionary; 
+0

관련 코드를 게시 –

+0

주세요 'results_category_list = NSJSONSerialization JSONObjectWithData : 데이터 선택해 NSJSONReadingMutableLeaves 오류 & myError];' –

+0

데이터로 저장하지 않으시겠습니까? 핵심 데이터 모델에서 유형을 BLOB로 변경하고, URL에서 반환 된 데이터를 저장하고, 필요할 때이를 dict 표현으로 변환 할 수 있습니까? – bennythemink

답변

1

데이터를 문자열로 변환하여 핵심 데이터에 저장해야합니다.

마찬가지로 :

NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

이제 코어 데이터에 jsonString을 저장하십시오.

1

핵심 데이터 모델의 특성 유형을 변형 가능으로 지정한 다음 해당 개체에 직접 NSDictionary 개체를 전달할 수 있습니다.

당신이 개체를 처리하는 NSManagedObject 서브 클래스를 작성하는 경우, 속성은 (당신이 선택적으로 나중에 액세스 할 때 직접 객체에 사전 기능을 사용할 수 NSDictionary으로 변경할 수 있습니다) 하위 클래스의 유형 id으로 올 것이다.

참고 :이 대체 솔루션이며 사전 개체를 문자열로 변환하지 않습니다.

0

JSON 사양은 키 순서가 고정되어 있지 않음을 명시합니다. 결과적으로 키가 수시로 혼합되어 술어를 사용하여 JSON 오브젝트를 검색 할 수 없게됩니다. NSJsonSerialization을 사용하여 코어 데이터를 저장/검색하는 NSString을 생성 한 후이 문제가 발생했습니다. 키의 순서가 매번 달라서 JSON 메시지가 이미 존재하는지 확인할 수 없었습니다.

https://stackoverflow.com/a/15125704/876903도 참조하십시오.

모든 키와 값을 순서대로 배열에 넣는 재귀 적으로 NSDictionary 범주를 만들기로 결정했습니다. 그런 다음 NSDictionary 개체가 코어 데이터 개체의 NSString과 함께 저장되어 있는지 확인하는 데 사용되었습니다.

내 핵심 데이터 개체에 따라서 포함 : I가 술어를 사용하는 것이

  • 키 (분류되어있는 NSString)
  • 값 (분류는 NSString)
  • 메시지 (, 변형있는 NSDictionary) JSON 객체가 다음과 같이 존재하는지 확인하십시오.

    [NSPredicate predicateWithFormat:@"(keys == %@) AND (values == %@)", sortedKeys, sortedValues]; 
    
0

testThis() 함수를 실행하여 모든 결과를 확인합니다. self.user.jsonTest는 변형 가능한 유형의 핵심 데이터입니다. Transformable CoreData 변수와 storeJSON으로 바꾸고 JSON을 검색하십시오. swiftyJSON을 사용하고 있습니다 만 사용하지 않으면 제거하는 것이 매우 쉽습니다.

func testThis() { 
    makeFakeData() { 
     self.retrieveJSON(self.user.jsonTest) { 
      json in 
      print("json: \(json)") 
     } 
    } 
} 

func storeJSON(dataToStore: [String: AnyObject], completion: (data: NSData?) -> Void) { 
    do { 
     let data = try NSJSONSerialization.dataWithJSONObject(dataToStore, options: []) 
     completion(data: data) 
    } catch let error as NSError { 
     print("NSJSONSerialization Error: \(error)") 
     completion(data: nil) 
    } 
} 

func retrieveJSON(dataToGet: NSObject?, completion: (json: JSON?) -> Void) { 
    if let data = dataToGet as? NSData { 
     do { 
      let nsJSON = try NSJSONSerialization.JSONObjectWithData(data, options: []) 
      completion(json: JSON(nsJSON)) 
     } catch let error as NSError { 
      print("NSJSONSerialization Error: \(error)") 
      completion(json: nil) 
     } 
    } 
} 

func makeFakeData(completion:() -> Void) { 
    var solarResourceDic: [String: String] = [:] 
    var srDics: [[String: String]!] = [] 

    for i in 0..<5 { 
     solarResourceDic = [:] 
     solarResourceDic["system_capacity"] = "\(i)" 
     solarResourceDic["azimuth"] = "\(i + 1)" 
     solarResourceDic["tilt"] = "\(i + 2)" 
     solarResourceDic["array_type"] = "\(i + 3)" 
     solarResourceDic["module_type"] = "\(i + 4)" 
     solarResourceDic["losses"] = "\(i + 5)" 
     srDics.append(solarResourceDic) 
    } 
    let dic = ["Solar Resource": srDics] 

    storeJSON(dic) { 
     data in 
     self.user.jsonTest = data 
     appDelegate.coreData.saveContext() 
    } 
    completion() 
}