2

URLからデータを取得しています。データは JSON 形式で提供されます。その JSON を文字列として Core Data に保存したいと考えています。どうやってやるの ?(私の JSON は NSDictionary オブジェクトであり、実行後、

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

5 に答える 5

1

データを文字列に変換し、それをコア データに保存する必要があります。

このような:

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

jsonString次に、コア データに保存します。

于 2013-02-13T06:19:34.877 に答える
1

https://github.com/stig/json-framework/を使用し、辞書を使用します

NSString* jsonString = [jsonDict JSONRepresentation];

コアデータが期待するとおりNSStringであり、NSDictionary.

于 2013-02-13T05:44:05.563 に答える
0

JSON 仕様では、キーの順序は固定されていないと記載されていることに注意してください。その結果、キーが時々混ざり合い、述語を使用して JSON オブジェクトを取得できなくなります。NSJsonSerialization を使用して Core Data に格納/取得するための NSString を生成した後、この問題が発生しました。キーの順序が毎回異なるため、その JSON メッセージが既に存在するかどうかを確認できませんでした。

https://stackoverflow.com/a/15125704/876903も参照してください。

すべてのキーと値を順序付けられた配列に再帰的に配置する NSDictionary カテゴリを作成することにしました。これを使用して、これらの NSString と共にコア データ オブジェクトに格納されている NSDictionary オブジェクトが既に格納されているかどうかを確認しました。

したがって、私のコアデータオブジェクトには次のものが含まれていました。

  • キー (ソートされた NSString)
  • 値 (並べ替えられた NSString)
  • メッセージ (変換可能な NSDictionary)

述語を使用して、JSON オブジェクトが次のように存在するかどうかを確認します。

[NSPredicate predicateWithFormat:@"(keys == %@) AND (values == %@)", sortedKeys, sortedValues];
于 2013-11-14T13:19:58.790 に答える
0

関数 testThis() を実行して、すべてが発生することを確認します。self.user.jsonTest は、Transformable 型の Core Data 変数です。これを任意の Transformable CoreData 変数に置き換えると、storeJSON と retrieve 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()
}
于 2016-09-01T23:00:44.443 に答える