我正在尝试将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
文件中读取数据,而又不创建一个新文件?