【问题标题】:Which persistent store is used by default in core data in iPhoneiPhone核心数据默认使用哪个持久化存储
【发布时间】:2011-10-18 07:05:03
【问题描述】:

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

【问题讨论】:

    标签: iphone ios core-data persistent-storage


    【解决方案1】:

    您可以使用配置。

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

    假设你想要一个托管对象上下文、一个托管对象模型、一个持久存储协调器,但有两个持久存储,例如第一个是 SQLite 存储,第二个是内存存储。

    对于此设置,您创建两个配置,“SQLiteStore”用于 SQLite 存储,“InMemoryStore”用于内存存储。在 XCode 中(打开你的 .xcdatamodel 文件):

    您会看到托管对象模型的可用配置列表。托管对象模型配置基本上是一组与字符串名称关联的实体描述。要添加配置,请在打开 .xcdatamodel 文件时使用 Editor -> Add Configuration 主菜单项,然后键入您喜欢的字符串名称。将要存储在第一个 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

    【讨论】:

      【解决方案2】:

      抓取应该不是问题。可以使用 NSFetchRequest 上的 setAffectedStores: 方法修改获取请求以搜索特定商店。

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

      至于您的问题,我知道并没有真正的默认机制,您可能只需将受影响的商店设置为您的所有商店:

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

      确保您在所有正确的地方寻找。

      【讨论】:

      • 嗨,我面临着与 OP 描述的类似的情况。我正在使用 MagicalRecord,我有一个对象模型,一个 NSPersistentStoreCoordinator,一个 NSManagedObjectContext,这是默认的一个和 2 个 SQLite NSPersistentStores。其中一个用作永久商店,另一个用作临时商店。在应用程序中,我填充了这个临时商店。但我得到 0 个结果。我在 MagicalRecord 的 Github 上发布了一个问题。你能看一下吗?
      【解决方案3】:

      我认为您确实想为每家商店使用 PSC。这将使您描述的问题消失,我真的不明白您为什么只想拥有一个 PSC。

      【讨论】:

      • 我认为应该可以使用一台 PSC。否则可能无法在 PSC 中添加多个商店。
      • 我认为 PersistentStoreCoordinator 的目的是协调多个持久存储。除非他们有不同的托管对象模型。
      • 这就是我正在使用的!如果我在内存中加载多个 PersistenteContainers 会出现什么问题吗?
      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2011-01-25
      • 2023-03-07
      • 2011-08-11
      • 1970-01-01
      相关资源
      最近更新 更多