RestKit - 无法映射实体

时间:2013-05-22 14:53:33

标签: objective-c restkit-0.20

我正在尝试使用Web服务映射名为Product的CoreData实体。

NSString *objName = @"Product";
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL: baseUrl];
NSManagedObjectContext *context = [[MContextManager sharedContextManager] managedObjectContext];
NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
[managedObjectStore createPersistentStoreCoordinator];
[managedObjectStore createManagedObjectContexts];
objectManager.managedObjectStore = managedObjectStore;

RKEntityMapping *objMap = [RKEntityMapping mappingForEntityForName:objName inManagedObjectStore:managedObjectStore];
[objMap addAttributeMappingsFromDictionary: @{
     @"CODE": @"code",
     @"LABEL": @"label",
 }];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:objMap pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
[objectManager getObjectsAtPath:objName parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    NSLog(@"ok");
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"ko");
}];
return;

你会猜测MContextManager是我的上下文管理器,我将它用于我对CoreData的所有查询。

我试图映射这个简单的实体已经有几个小时了,我得到的错误如下:

  

无法创建托管对象上下文:持久性存储协调器没有任何持久性存储。这可能意味着您忘记添加持久性存储,或者尝试这样做失败并出现错误。

我虽然在第一行设置了持久存储,但不是吗?

更新

我为持久性商店添加了这个:

NSURL *appDocs = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSString *storeURL = [appDocs URLByAppendingPathComponent:@"my-model.sqlite"].absoluteString;
[managedObjectStore addSQLitePersistentStoreAtPath:storeURL fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:nil];

仍有相同的错误

2 个答案:

答案 0 :(得分:2)

我尝试将自己的CoreData配置与新版本的RestKit一起使用,最终遇到了从不同上下文访问对象和数据不一致的几个问题。这是我的RestKit初始化的代码:

NSError * error;
NSURL * modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"]];
NSManagedObjectModel * managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy];
RKManagedObjectStore * managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

[managedObjectStore createPersistentStoreCoordinator];

NSArray * searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentPath = [searchPaths objectAtIndex:0];
NSPersistentStore * persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:[NSString stringWithFormat:@"%@/CoreData.sqlite", documentPath] fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error];

if(!persistentStore){
  NSLog(@"Failed to add persistent store: %@", error);
}

[managedObjectStore createManagedObjectContexts];

[RKManagedObjectStore setDefaultStore:managedObjectStore];

_objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://localhost:3000/"]];
_objectManager.managedObjectStore = managedObjectStore;

// Object Mapping Code...

在上下文管理器中,您可以使用[RKObjectManager sharedManager].managedObjectStore.mainQueueManagedObjectContext访问生成上下文 这应该允许您仍然与您的经理进行CoreData查询。

答案 1 :(得分:1)

您正在创建持久性商店协调员,但不是持久性商店。您需要运行addSQLitePersistentStoreAtPath:fromSeedDatabaseAtPath:withConfiguration:options:error:将数据保存到磁盘或addInMemoryPersistentStore:以将其保存在内存中。