使用 RestKit 0.2x 创建两个独立的持久存储

Posted

技术标签:

【中文标题】使用 RestKit 0.2x 创建两个独立的持久存储【英文标题】:creating two separate persistent stores with RestKit 0.2x 【发布时间】:2013-06-28 02:40:19 【问题描述】:

我的项目设计要求我使用两个不同的RKObjectManagers 和两个不同的baseURLs 创建两个完全独立的持久存储:

manager 1 : 将处理 store1.sqlite

经理2:将处理store2.sqlite

所以,据我所知,我必须创造:

1) 2 个独立的数据模型:模型 1 和模型 2

2) 2 个独立的托管对象上下文:上下文 1 和上下文 2

3) 1 persistentStoreCoordinator

我之前曾经设置RestKit 0.2x 来处理核心数据(1 个商店),如下所示:

  NSError *error = nil;    
NSURL *modelURL1 = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"store1" ofType:@"momd"]];
NSManagedObjectModel *managedObjectModel1 = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL1] mutableCopy];
RKManagedObjectStore *managedObjectStore1 = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel1];
[managedObjectStore1 createPersistentStoreCoordinator];
NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Store1.sqlite"];
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error];
  if (error) 
NSLog(@"unresolved error %@, %@", error, [error userInfo]);
abort();
 
[managedObjectStore1 createManagedObjectContexts];
manager1.managedObjectStore = managedObjectStore1 ;

managedObjectStore1.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore1.mainQueueManagedObjectContext];

manager1 是RKObjectManager

我的问题是:

1) 我应该对这段代码进行哪些更改才能正确设置 2 个完全独立的持久性存储?

2)我如何访问与(例如store1)相关的所需上下文,我通常使用managedObjectStore1.mainQueueManagedObjectContext]

提前谢谢你。

附言在applicationDidFinishLaunchingWithOptions 我必须通过简单地删除带有NSFileManager 的sqlite 文件并创建一个新的干净文件来擦除所有store 2 数据,有人可能会问为什么还要保留数据?因为使用内存中的 NSObjects 会杀死 iPhone 内存,在我的情况下,有数千条记录可供使用。

【问题讨论】:

为什么需要两个完全独立的 RestKit/CoreData 堆栈?只有两个持久存储还不够吗? 【参考方案1】:

你不会有一个持久的商店协调员,你会有两个。只需复制您的代码并拥有所有详细信息的 2 个存储区,合理命名它们并像您当前一样通过适当的 managedObjectStore 访问 MOC。唯一稍微复杂的是您如何访问 managedObjectStore,因为您现在不能使用 RestKit 提供的默认存储。您应该使用自己的单例来存储您的上下文并在单例上提供公共方法。

【讨论】:

是否也可以将 managedObjectStore 作为 AppDelegate 的属性,以便我可以在整个应用程序中访问它?据我所知,协调器在持久存储之间进行协调是不合理的。 您可以使用应用程序委托,但这不是它的用途。很多人这样做,但这是不好的做法。您必须有 2 个不同的协调员,因为您有 2 个不同的代码数据模型。

以上是关于使用 RestKit 0.2x 创建两个独立的持久存储的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.2x 同时 RKManagedObjectRequestOperation

使用 RestKit 0.2x 将文件作为单部分文档发布

RestKit 0.2 映射 Core Data <--> JSON 与一对多关系

RestKit .20.x 价值转换

Restkit 0.20.x cocoapods 安装问题 - 编译但找不到 RestKit 的导入

RestKit:两个独立的提要,两种不同的对象类型。一个对象管理器?