我正在使用纯远程数据库将我的应用程序更改为将远程数据库拉入本地数据库。当我试图从远程数据库获取一个对象数组时,我收到此错误。
CoreData: error: Failed to call designated initializer on NSManagedObject class 'Class'
我不确定我做错了什么。这是我的restkit设置。
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://fake.herokuapp.com"]];
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"App" withExtension:@"momd"];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
manager.managedObjectStore = managedObjectStore;
RKEntityMapping *classMapping = [RKEntityMapping mappingForEntityForName:@"Class" inManagedObjectStore:managedObjectStore];
[classMapping addAttributeMappingsFromDictionary:[Class propertyMappings]];
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
RKResponseDescriptor *classDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:classMapping pathPattern:@"/class.json" keyPath:@"" statusCodes:statusCodes];
[manager addResponseDescriptorsFromArray:@[classDescriptor]];
[managedObjectStore createManagedObjectContexts];
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];
[RKObjectManager setSharedManager:manager];
这是我正在提出的请求,它失败的地方(我想在回复上)。
[manager getObjectsAtPath:@"class.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult){
NSLog(@"Success");
}failure:^(RKObjectRequestOperation *operation, NSError *error) {}];
如果您还有其他需要,请告诉我。 如果你能帮忙,我将是一个非常开心的开发者。
谢谢,
-DO
这是propertMappings返回的内容
+ (NSDictionary *) propertyMappings{return @{@"id" : @"iD", @"name" : @"name", @"image_url" : @"image_url"};}
答案 0 :(得分:1)
首先,我怀疑你有一个名为“Class”的课程会有问题,因为“Class”已经是typedef struct
中定义的objc.h
。我建议将您的班级名称重构为ABCClass
或非保留的名称。
其次,您通过调用[Class propertyMappings]
添加属性映射。你应该做这样的事情:
[classMapping addAttributeMappingsFromDictionary:@{
@"_id" : @"objectId",
@"first_name":@"firstName",
@"last_name":@"lastName"
}];
不要忘记将identificationAttributes
添加到映射中,以防止核心数据中出现重复的对象。
最后,您是否在设置的任何阶段创建了实际的sqlite文件?在您致电-(void)createManagedObjectContexts
:
[managedObjectStore createPersistentStoreCoordinator];
NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"App.sqlite"];
NSError *error;
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error];
NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);
答案 1 :(得分:0)
问题实际上是我试图引入的实体是通过我的模型中的一些关系嵌套的,因此它不是父级。这导致了错误。我不得不稍微调整一下api,一切正常。
感谢您的帮助。
-DO