如何在不创建新核心数据持久性存储的情况下读取现有核心数据持久性存储?

时间:2020-06-07 15:08:47

标签: swift core-data database-migration

我正在尝试将Core Data数据库迁移到Realm。我可以更改代码中的API(实际上是对应用程序进行了完全重写),但是问题是迁移了存储在用户设备上的现有数据。

要从Core Data中读取数据,我首先创建一个NSManagedObjectContext,并将其persistentStoreCoordinator设置为协调器:

// app delegate, didFinishLaunching
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator

要创建此coordinator,请执行以下操作:

let modelURL = Bundle.main.url(forResource: "MyModel", withExtension: "momd")!
let managedObjectModel = NSManagedObjectModel(contentsOf: modelURL)!
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

这时,我不知道下一步该怎么做。通常,在Core Data应用中,我会在所需的URL上添加永久存储...

let url = aDesiredURL.appendingPathComponent("MyPersistentStore.sqlite")
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true,
        NSInferMappingModelAutomaticallyOption: true])

...就像创建项目时选中“使用核心数据”时Xcode为您生成的核心数据样板一样。

但是,由于要迁移,所以我不想添加新的持久性存储。如果已经在aDesiredURL中存储了一个“ MyPersistentStore.sqlite”文件,我只想从中读取。

根据我的实验,addPersistentStore似乎会创建一个新的MyPersistentStore.sqlite文件(如果该文件不存在),并从该文件中读取(如果已经存在),但是我希望有一个方法从MyPersistentStore.sqlite中读取。存在,并且不创建新文件(如果不存在,则抛出错误?)。

我仔细阅读了NSPersistentStoreCoordinator文档中的方法,发现persistentStore(for:)听起来很有希望。但是,无论.sqlite文件是否存在,它都返回nil。

创建协调器后,我也尝试不执行任何操作,但这也不起作用:我无法从上下文中检索任何托管对象(获取请求返回了0个对象)。

获取实体以供参考的代码:

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "MyEntity")
let managedObjects = try managedObjectContext.fetch(fetchRequest)
print(managedObjects.count)

如何仅从表示核心数据持久性存储的.sqlite文件中读取数据,而又不创建一个新文件?

0 个答案:

没有答案
相关问题