4

RestKitを使用してネストされたコアデータモデルをJSONファイルに変換し、それをWebサービスにアップロードしています。次に、同じJSONをリクエストして戻し、コアデータオブジェクトに再インフレートしようとしています。インフレ中にこのエラーが発生します:

 CoreData: error: Failed to call designated initializer on NSManagedObject class 'AppUser' 
    2012-04-26 10:25:50.850 DropboxSync[3824:5843] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AppUser 0x2b7820> valueForUndefinedKey:]: the entity (null) is not key value coding-compliant for the key "lastName".'

クラスにはlastNameプロパティがあります。

@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;
@property (nonatomic, retain) NSString * localDataFilepath;
@property (nonatomic, retain) NSSet *events;
@property (nonatomic, retain) AppUserWrapper *wrapper;

**What could be causing this?** 

CoreDataモデルで3つのエンティティを定義しました。

ユーザーイベント画像

ユーザーには複数のイベントがあり、イベントには複数の画像があります

以下に定義するように、RestKitオブジェクトマッピングを定義しました。

-(void)setupObjectMapping {RKObjectManager * objectManager = [RKObjectManager sharedManager]; RKObjectMapping * mapping = [RKObjectMapping mappingForClass:[記事クラス]];

    [mapping mapAttributes:@"articleID", @"title", @"body", nil];

    //********************************    

    RKObjectMapping *imageMapping = [RKObjectMapping mappingForClass:[ImageEntity class]];

    [imageMapping mapAttributes:@"createDate", @"localFilePath", nil];
    [objectManager.mappingProvider addObjectMapping:bleedImageMapping];
    [objectManager.mappingProvider setSerializationMapping:[imageMapping inverseMapping] forClass:[ImageEntity class]];
    [objectManager.mappingProvider imageMapping forKeyPath:@"images"];

    //********************************    

    RKObjectMapping *eventMapping = [RKObjectMapping mappingForClass:[Event class]];

    [eventMapping mapAttributes:@"createDate", @"severity", nil];
    [eventMapping mapRelationship:@"images" withMapping:imageMapping];

    [objectManager.mappingProvider addObjectMapping:eventMapping];
    [objectManager.mappingProvider setSerializationMapping:[eventMapping inverseMapping] forClass:[Event class]];
    [objectManager.mappingProvider setMapping:eventMapping forKeyPath:@"bleedEvents"];

    //******************************** 
    //setup App user mapping
    RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[AppUser class]];

    [userMapping mapAttributes:@"firstName", @"lastName", nil];
    [userMapping mapRelationship:@"events" withMapping:eventMapping];
    [objectManager.mappingProvider addObjectMapping:userMapping];
    [objectManager.mappingProvider setSerializationMapping:[userMapping inverseMapping] forClass:[AppUser class]];
    [objectManager.mappingProvider setMapping:userMapping forKeyPath:@"appUser"];

    //******************************** 
    //setup App user wrapper mapping
    RKObjectMapping *userWrapperMapping = [RKObjectMapping mappingForClass:[AppUserWrapper class]];


    [userWrapperMapping mapRelationship:@"appUser" withMapping:userMapping];
    [objectManager.mappingProvider addObjectMapping:userWrapperMapping];
    [objectManager.mappingProvider setSerializationMapping:[userWrapperMapping inverseMapping] forClass:[AppUserWrapper class]];
    [objectManager.mappingProvider setMapping:userWrapperMapping forKeyPath:@"appUserWrapper"];


}

ネストされたデータ構造をJSONに変換する方法は次のとおりです。

-(void)convertTestUserToJSON
{

    NSString* fullPath = [[$ documentPath] stringByAppendingPathComponent:@"sampleJSONFolder"];
    [[NSFileManager defaultManager] createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:nil];
    // Make the file

    NSString* fullFilepath = [NSString stringWithFormat:@"%@_%@.json",appUser.firstName,appUser.lastName];
    NSString* dataFile = [fullPath stringByAppendingPathComponent:fullFilepath];
    appUser.localDataFilepath = dataFile;
    [[AppUser managedObjectContext] save:nil];


    NSError* error = nil;


    RKObjectMapping *serMap = [[[RKObjectManager sharedManager] mappingProvider] serializationMappingForClass:[AppUser class]];
    NSDictionary *d = [[RKObjectSerializer serializerWithObject:appUser mapping:serMap] serializedObject:&error];


    if(error!=nil)
    {
        NSLog(@"!!!!! Error: %@",[error localizedDescription]);
    }

   //this is where the JSON is generated
    NSString* dataContents = [d JSONString];
  BOOL success =  [dataContents writeToFile:dataFile atomically:YES encoding:NSUTF8StringEncoding error:nil];
    if(!success)
    {
        NSLog(@"Error writing to data file!");
    }
}

これがJSON変換の結果です

{"firstName":"First Name0","events":[{"severity":0,"images":[{"createDate":"2005-04-21 08:28:47 +0000","localFilePath":"localPhoto#10.png"},{"createDate":"2009-12-19 07:26:54 +0000","localFilePath":"localPhoto#11.png"}],"createDate":"2003-05-25 15:32:53 +0000"},{"severity":1,"images":[{"createDate":"2008-08-02 19:40:14 +0000","localFilePath":"localPhoto#10.png"},{"createDate":"2007-01-12 05:50:27 +0000","localFilePath":"localPhoto#12.png"},{"createDate":"2007-05-28 12:19:39 +0000","localFilePath":"localPhoto#11.png"}],"createDate":"2001-05-28 23:38:23 +0000"},{"severity":2,"images":[{"createDate":"2002-10-09 19:47:39 +0000","localFilePath":"localPhoto#10.png"},{"createDate":"2008-08-17 03:21:12 +0000","localFilePath":"localPhoto#11.png"}],"createDate":"2005-10-18 03:40:52 +0000"}],"lastName":"Last Name83"}

このJSONをネストされたコアデータエンティティに戻そうとすると、エラーが発生します。

CoreData: error: Failed to call designated initializer on NSManagedObject class 'AppUser' 
2012-04-26 10:25:50.850 DropboxSync[3824:5843] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AppUser 0x2b7820> valueForUndefinedKey:]: the entity (null) is not key value coding-compliant for the key "lastName".'  

インフレータは、マッピングを試みる前にすべての関係をインスタンス化するわけではないようです。私が間違っている?これを引き起こす原因は何ですか?JSONを2つの異なる方法で再膨張させようとしましたが、どちらの場合もこのエラーが発生しました。どうすれば解決できますか?

ご入力ありがとうございます!

4

1 に答える 1

4

問題はCore Data を扱うときRKObjectMappingの代わりに を使用しているため、RestKitは通常の としてインスタンス化しています。RKEntityMappingNSManagedObjectNSObject

于 2012-10-10T15:19:41.730 に答える