我在我的应用程序中创建多个持久性存储,但我只使用一个持久性存储协调器和托管对象模型。现在我的问题是当我在托管对象上下文上调用save方法时,它将使用哪个持久性存储来保存对象。所以我想指定用于保存对象的持久性存储。从数据库中获取对象时,我想确保我的fetch查询应该在特定的商店上执行,这样我才能从该商店获取对象。有什么帮助吗?
答案 0 :(得分:5)
您可以使用配置。
[PersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:nil error:]
假设您希望拥有单个托管对象上下文,单个托管对象模型,单个持久性存储协调器但两个持久性存储,例如,第一个将是SQLite存储,第二个将是内存存储。
对于此设置,您将创建两个配置,SQLite存储的“SQLiteStore”和内存存储的“InMemoryStore”。在XCode中(打开.xcdatamodel文件):
您会看到托管对象模型的可用配置列表。托管对象模型配置基本上是与字符串名称关联的一组实体描述。要添加配置,请使用编辑器 - >在打开.xcdatamodel文件时添加配置主菜单项,然后键入您喜欢的字符串名称。将要存储在第一个SQLite存储中的实体拖到“SQLiteStore”配置,将其他实体拖到“InMemoryStore”配置中。
好的,就是这样,现在是时候更新代码了。转到范围,在该范围内创建持久性存储协调器并向其添加持久性存储。唯一的变化是为它们指定配置:
...
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:yourManagedObjectModel];
NSURL storeURL = … // your store url
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"SQLiteStore" URL:storeURL options:nil error:&error])
{
NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]);
abort();
}
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:@"InMemoryStore" URL:nil options:nil error:&error])
{
NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]);
abort();
}
...
现在就是这样,你拖到“InMemoryStore”配置的所有实体都将自动保存到内存持久性存储中,“SQLiteStore”也是如此。也许你必须在那之后在设备/模拟器上重新安装你的应用程序。
快速恢复:
答案 1 :(得分:4)
提取不应成为问题。可以修改获取请求以使用NSFetchRequest上的setAffectedStores:方法搜索特定存储。
在创建对象时,可以使用NSManagedObjectContext上的assignObject:toPersisentStore:方法将实体分配给特定的商店。
关于你的问题,我并没有真正意义上的默认机制,可能你需要将受影响的商店设置到你的所有商店:
[request setAffectedStores:[NSArray arrayWithObjects:firstStore,secondStore,thirdStore, nil]];
确保您正在寻找所有合适的地方。
答案 2 :(得分:0)
我认为你真的想为每家商店使用PSC。这会让你描述的问题消失,我真的不明白为什么你想要只有一个PSC。