2012-04-26 4 views
4

私はRestKitを使用してネストされたコアデータモデルをJSONファイルに変換し、次に、私は同じJSONリクエストを取得し、それをコアデータオブジェクトに再展開しようとしています。私はインフレ時にこのエラーを取得しています:JSONをネストされたコアデータエンティティにデシリアライズしているときにiPhoneコアデータ「NSManagedObjectクラスで指定された初期化子をコールできませんでした」エラー

ユーザー イベント 画像:私は私のコアデータモデルで定義された3つのエンティティを得た

@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: 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のプロパティを持っています

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

私は以下に定義されている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にネストされたデータ構造に変換する方法は次のとおりです。私は背中に、この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"} 

の結果ですネストされたコアデータエンティティの場合、エラーが発生します。

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つの異なる方法で再膨張しようとしましたが、この両方のエラーが発生しました。どのように解決することができますか?

ありがとうございました! RestKitのが通常NSObjectとしてNSManagedObjectをインスタンス化するので、コアデータを扱うとき

+1

これは何らかの理由がありますか?私は同様のトラブルに直面しています。答えをあなたの解決策に更新してください。 –

+0

問題を解決しましたか? – Bonnie

答えて

4

問題はRKObjectMapping代わりのRKEntityMappingを使用しています。

+2

FYI - RKManagedObjectMappingがRKEntityMappingになりました - https://github.com/RestKit/RestKit/wiki/Upgrading-from-v0.10.x-to-v0.20.0を参照してください –

関連する問題