0

次のような辞書に変換するJSON応答があります。

NSError *error;
self.restKitResponseDict = [NSDictionary dictionaryWithDictionary:[NSJSONSerialization JSONObjectWithData:response.body options:0 error:&error]];

次の属性/プロパティを持つコアデータクラスがあります。

name
image_url

上からログを記録すると、次のようにリストされているrestKitResponseDictことがわかります。image_url"image_url"

name = Rock;
"image_url" = "http://f.cl.ly/items/122s3f1M1E1p432B211Q/catstronaut.jpg";

これがKVCがクラッシュする理由です

[CoreDataClass setValuesForKeysWithDictionary:self.restKitResponseDict];

このような:

'[<CoreDataClass 0x14132c> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key image_url.'

引用符は重要ですか?サーバー担当者に、原因となる可能性のあるアンダースコアを削除するように依頼する必要がありますか?

コアデータクラス:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface CoreDataClass : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * image_url;

@end

@implementation CoreDataClass

@dynamic name;
@dynamic image_url;

@end
4

2 に答える 2

1

メソッドをクラス オブジェクトに送信しています。

[CoreDataClass setValuesForKeysWithDictionary:self.restKitResponseDict];

おそらく実際の CoreDataClass インスタンスに送信したい場合:

[coreDataClassObject setValuesForKeysWithDictionary:self.restKitResponseDict];

編集

クラスからオブジェクトを初期化する最も簡単な方法は何ですか? – エリック

これは NSManagedObject のサブクラスであるため、通常の Core Data メソッドを使用します。新しいオブジェクトを作成する 1 つの方法:

CoreDataClass *coreDataObject = [NSEntityDescription
    insertNewObjectForEntityForName:@"YOUR_ENTITY_NAME"
    inManagedObjectContext:managedObjectContext];

Core Data の使用に関する基本的な情報が必要な場合は、次の Core Data プログラミング ガイドを参照してください。 uid/TP30001200-SW1

于 2012-08-26T14:58:17.827 に答える
1

NSLog()with の形式%@ではdescriptionメソッドを使用してオブジェクトを出力し、a の説明でNSDictionaryはアンダースコアなどの特殊文字を含むすべてのキーと値を引用符で囲みます。例えば

NSDictionary *dict = @{
    @"key1" : @"value_1",
    @"key_2" : @"value2"
};
NSLog(@"dict=%@", dict);

生産する

2012-08-25 18:15:33.553 test27[3416:c07] dict={
    key1 = "value_1";
    "key_2" = value2;
}

したがって、JSON ディクショナリのキーには実際には引用符がなく、アンダースコアはおそらくエラーの原因ではありません。

エラー メッセージは、管理対象オブジェクトに属性がないimage_urlことを示しているため、確認する必要があります。

于 2012-08-25T16:19:49.057 に答える