将核心数据数据库导入新项目
Importing Core Data database to new project
我正在另一个项目中将应用程序从 Objective-C 重写为 Swift,我在导入核心数据数据库时遇到问题(获取请求 return 空结果),这在之前的项目中由 MagicalRecord 处理。
这是我正在做的事情:
已将数据库模型文件复制到新项目。
将该模型文件添加到构建阶段的编译源和复制包资源中。
在模型文件中将实体代码生成语言从 objc 更改为 swift。
创建 NSManagedObject 子类
我检查过的内容:
- PersistentStore 的 URL 与之前的项目相同(除了沙箱的应用程序标识符)。
- 模型文件名与上一个项目相同。
- Target、scheme、project 和 bundle id 与之前的项目相同。
- 整个核心数据堆栈(下面的代码)的初始化工作没有错误。
下面是我初始化堆栈的方法(当然这里的字符串我已经更改了已知原因,它们在项目中有效):
lazy var applicationDocumentsDirectory: URL = {
let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
var applicationDocumentsDirectoryRaw = urls[urls.count-1]
applicationDocumentsDirectoryRaw.appendPathComponent("App_Name", isDirectory: true)
return applicationDocumentsDirectoryRaw
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = Bundle.main.url(forResource: "Model_Name", withExtension: "momd")!
return NSManagedObjectModel.init(contentsOf: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("CoreDataStore.sqlite")
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true])
} catch {
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
PersistentStore 的 url 在当前和以前的项目中不相同。
我以为是,但不是。
MagicalRecord 的一种方法 - NSPersistentStore.MR_defaultLocalStoreUrl
- 返回了无效的 NSURL.
为了子孙后代 - 通过 Xcode 设备管理器下载您应用的 IPA 并手动找出其 URL 的位置!
我正在另一个项目中将应用程序从 Objective-C 重写为 Swift,我在导入核心数据数据库时遇到问题(获取请求 return 空结果),这在之前的项目中由 MagicalRecord 处理。
这是我正在做的事情:
已将数据库模型文件复制到新项目。
将该模型文件添加到构建阶段的编译源和复制包资源中。
在模型文件中将实体代码生成语言从 objc 更改为 swift。
创建 NSManagedObject 子类
我检查过的内容:
- PersistentStore 的 URL 与之前的项目相同(除了沙箱的应用程序标识符)。
- 模型文件名与上一个项目相同。
- Target、scheme、project 和 bundle id 与之前的项目相同。
- 整个核心数据堆栈(下面的代码)的初始化工作没有错误。
下面是我初始化堆栈的方法(当然这里的字符串我已经更改了已知原因,它们在项目中有效):
lazy var applicationDocumentsDirectory: URL = {
let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
var applicationDocumentsDirectoryRaw = urls[urls.count-1]
applicationDocumentsDirectoryRaw.appendPathComponent("App_Name", isDirectory: true)
return applicationDocumentsDirectoryRaw
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = Bundle.main.url(forResource: "Model_Name", withExtension: "momd")!
return NSManagedObjectModel.init(contentsOf: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("CoreDataStore.sqlite")
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: [NSMigratePersistentStoresAutomaticallyOption: true])
} catch {
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
PersistentStore 的 url 在当前和以前的项目中不相同。
我以为是,但不是。
MagicalRecord 的一种方法 - NSPersistentStore.MR_defaultLocalStoreUrl
- 返回了无效的 NSURL.
为了子孙后代 - 通过 Xcode 设备管理器下载您应用的 IPA 并手动找出其 URL 的位置!