[英]Error : CoreData: error: Failed to call designated initializer on NSManagedObject class 'Product'
[英]iPhone Core Data “Failed to call designated initializer on NSManagedObject class” error while deserializing JSON into a nested core data entity
我正在使用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?**
我在Core Data模型中定義了3個實體:
用戶事件圖像
用戶有多個事件,事件有多個圖像
我已經定義了一個如下定義的RestKit對象映射。
- (void)setupObjectMapping {RKObjectManager * objectManager = [RKObjectManager sharedManager]; RKObjectMapping * mapping = [RKObjectMapping mappingForClass:[Article class]];
[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".'
看來inflater在嘗試映射之前不會實例化所有關系。 我錯了嗎? 是什么導致這種情況發生? 我試圖用兩種不同的方式重新充氣我的JSON,兩次都出現了這個錯誤。 怎么解決?
謝謝你的任何輸入!
問題是在處理Core Data時使用RKObjectMapping
而不是RKEntityMapping
,因此RestKit將NSManagedObject
實例化為常規NSObject
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.