Swift4:在两个核心数据存储之间切换

时间:2018-01-27 03:03:19

标签: ios core-data swift4

我需要两个不同的CoreData数据库存储,具体取决于我的应用程序运行的模式。只需在应用程序首次运行时进行切换。

理想情况下,这将使用persistentContainer进行设置:

lazy var persistentContainer: NSPersistentContainer = 
{
    let container = NSPersistentContainer(name: "myApp")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? 
        {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
}

我基本上只需要找到如下命令:

if mode == 1
{
    storeName = "MyStore1.sqlite"
}
else
{
    storeName = "MyStore2.sqlite"
}
container.useStore(storeName)

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。概括地说,典型配置包括单个NSManagedObjectContext,其中需要NSPersistentStoreCoordinator,而NSManagedObjectModel则需要NSPersistentStoreCoordinator。如果您希望在前端和持久性存储之间有一个中间步骤,则上下文可以在其上方具有另一个上下文。

无论哪种方式,你都有几个选择(可能还有更多):

  1. 将另一家商店添加到您的NSManagedObjectContext(请参阅this answer
  2. 如果您还想为每个商店设置两个单独的模型,请创建两个不同的NSPersistentStoreCoordinator实例,每个实例都有自己的NSManagedObjectModelmode == 1
  3. 选项#2在代码管理方面会有点笨拙,所以如果你只担心数据的物理存储位置,我会选择#1选项。否则,您可能想要创建某种上下文管理器来正确监督每个上下文(您也可以将model == 2 / RewriteRule ^/guit/(.+) /guiwordpress/wp-content/themes/storefront/$1 [L,QSA] 逻辑放在这里)以确保它们不会踩到彼此的脚趾。

答案 1 :(得分:1)

使用 int check_odd(unsigned long n) { if (n / 10 == 0) { return n % 2 != 0 ? 1 : 0; } else { return (n % 10 % 2 != 0? 1:0)+check_odd(n/10); } } 初始化持久性容器时,该名称用于定位模型和持久性存储。来自the docs

  

默认情况下,提供的名称值用于命名持久性存储,用于查找要与NSPersistentContainer对象一起使用的NSManagedObjectModel对象的名称。

但是您可以使用另一个初始化程序init(name:),它允许您为模型和商店指定单独的名称。来自the docs

  

默认情况下,容器的提供名称值用作与容器关联的persisent商店的名称。传入NSManagedObjectModel对象会使用提供的名称值覆盖模型的查找。

因此,只需在初始化持久性容器时指定正确的名称和managedObjectModel参数,即可实现所需。