iPhone中的核心数据默认使用哪种持久化存储?

9

我在我的应用程序中创建了多个持久化存储,但我只使用一个持久化存储协调器和托管对象模型。现在我的问题是,当我在托管对象上下文中调用保存方法时,它将使用哪个持久化存储来保存对象。因此,我想指定要用于保存对象的持久化存储。同样,在从数据库中获取对象时,我希望确保我的获取查询应该在特定的存储上执行,以便我只从该存储获取对象。有任何帮助吗?

3个回答

6

您可以使用配置文件。

[PersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:nil error:]

假设您想要一个单一的托管对象上下文、单一的托管对象模型和单一的持久化存储协调器,但有两个持久化存储,例如第一个是SQLite存储,第二个是内存中的存储。
为此,您创建了两个配置,"SQLiteStore"用于SQLite存储,"InMemoryStore"用于内存中的存储。在XCode中(打开您的.xcdatamodel文件): .xcdatamodel file in XCode 您将看到托管对象模型的可用配置列表。托管对象模型配置基本上是与字符串名称相关联的实体描述集合。要添加配置,请在打开.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. 在管理对象模型编辑器(.xcdatamodel文件)中创建配置;
  2. 在代码中添加多个持久化存储器到持久化存储器协调器中,并提供相应的配置名称。

欲知详情,请参阅此链接:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-SW4


5

获取数据不应该是一个问题。可以使用NSFetchRequest上的setAffectedStores:方法,修改fetch请求以搜索特定的存储。

当你创建一个对象时,可以使用NSManagedObjectContext上的assignObject:toPersisentStore:方法将实体分配到特定的存储。

至于你的问题,我不太清楚是否有默认机制,可能需要将受影响的存储设置为所有存储:

[request setAffectedStores:[NSArray arrayWithObjects:firstStore,secondStore,thirdStore, nil]];

确保你正在查找所有正确的位置。


嗨,我遇到了与OP描述的类似情况。我正在使用MagicalRecord,并且我有一个对象模型,一个NSPersistentStoreCoordinator,一个默认的NSManagedObjectContext和2个SQLite NSPersistentStore。其中一个充当永久存储,另一个充当临时存储。在应用程序中,我填充此临时存储。但是我得到了0个结果。我在MagicalRecord的Github上发布了一个问题。你能看一下吗? - Isuru

0

我认为你真的想为每个商店使用一个PSC。这将消除你所描述的问题,我真的看不出为什么你只想要一个PSC。


1
我认为使用一个PSC应该是可能的。否则,在PSC中添加多个商店的功能可能不存在。 - Darshan Prajapati
我认为PersistentStoreCoordinator的目的是协调多个持久化存储,除非它们具有不同的托管对象模型。 - daver
这就是我正在使用的!如果我一次加载多个PersistenteContainers到内存中,是否会出现任何问题? - Siempay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接