基于现有核心数据存储创建 RKManagedObjectStore

Posted

技术标签:

【中文标题】基于现有核心数据存储创建 RKManagedObjectStore【英文标题】:Creating RKManagedObjectStore based on Existing Core Data Store 【发布时间】:2015-01-08 11:43:16 【问题描述】:

我不确定我是否真的了解我在做什么,但我的问题是我无法设置 RKManagedObjectStore 以同时使用 Core Data 和 RestKit。我尝试了以下方法:

NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.MYAPPLICATIONURL"];
storeURL = [storeURL URLByAppendingPathComponent:@"MYAPPLICATIONNAME.sqlite"];
NSError *error = nil;
manager.managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[[CoreDataHandler instance] managedObjectModel]];
[manager.managedObjectStore addSQLitePersistentStoreAtPath:[storeURL absoluteString] fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error];

if (error != nil) 
    NSLog(@"\nSerious object store error: %@", error);
    return;
 else 
    [manager.managedObjectStore createManagedObjectContexts];

[[CoreDataHandler instance] managedObjectModel] 返回默认的 CoreData 对象模型。我没有更改 xcode 模板提供的初始化代码的任何内容。

我得到的错误是:

CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:MYURLTOSQLITEFILE

...

returned error Error Domain=NSCocoaErrorDomain Code=512 "The operation couldn’t be completed. (Cocoa error 512.)" UserInfo=0x7fc5aaf9f290 reason=Failed to create file; code = 2 with userInfo dictionary 
    reason = "Failed to create file; code = 2";

所以我的问题是:我是否以正确的方式尝试这个? RestKit 是否需要它自己的持久存储,它将与“默认”存储同步?还是它是同一个存储,我只是初始化错误?

提前致谢!

【问题讨论】:

【参考方案1】:

我也在我的应用程序中使用 RestKit。为了管理/存储 RestKit 数据以外的应用程序数据,我实施了您尝试过的反向方法。我首先配置了 restKit 并将该上下文用于其他数据。

我创建了一个 RestKitHandler 类来管理所有基于 restKit 的活动,并且我在应用程序的所有其他部分中使用该类的单例 - [RestKitHandler sharedInstance] 实例。

RestKitHandler 类中创建RKObjectManager 的强属性,

@property (nonatomic, strong) RKObjectManager *objectManager;

并在你的RestKitHandler.m 中配置restKit 之类的,

// Configure RestKit
NSString *const baseURL = @"http://baseURL";

self.objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:baseURL]];
[_objectManager.HTTPClient setDefaultHeader:@"KEY" value:@"value"];
_objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

// Set up persistance storage and create managed object context to connect RestKit with CoreData
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
_objectManager.managedObjectStore = managedObjectStore;

[managedObjectStore createPersistentStoreCoordinator];

NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"YourApp.sqlite"];

NSError *error;

NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:@NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES error:&error];

NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

[managedObjectStore createManagedObjectContexts];

// Configure a managed object cache to ensure we do not create duplicate objects
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

通过这个方法你可以从objectManager实例中获取所有核心数据相关的对象,比如,

[[[[RestKitHandler sharedInstance] objectManager] managedObjectStore] persistentStoreManagedObjectContext];

OR

[[[[RestKitHandler sharedInstance] objectManager] managedObjectStore] mainQueueManagedObjectContext];

// Also all other objects like this

【讨论】:

以上是关于基于现有核心数据存储创建 RKManagedObjectStore的主要内容,如果未能解决你的问题,请参考以下文章

与现有核心数据实体不同

核心数据对现有项目 iphone 的影响

使用实体框架核心生成和访问存储过程

如果不存在则创建新的核心数据对象,或者如果核心数据存在则获取现有对象[重复]

如何创建从一个实体到另一个现有实体的核心数据关系?

核心数据建议将现有实体置于现有实体中