将核心数据数据库导入新项目
Posted
技术标签:
【中文标题】将核心数据数据库导入新项目【英文标题】:Importing Core Data database to new project 【发布时间】:2018-01-22 11:07:07 【问题描述】:我正在另一个项目中将应用程序从 Objective-C 重写为 Swift,但在导入核心数据数据库时遇到问题(获取请求返回空结果),在之前的项目中由 MagicalRecord 处理。
这是我在做什么:
将数据库模型文件复制到新项目中。
将该模型文件添加到编译源并在构建阶段复制捆绑资源。
在模型文件中将实体代码生成语言从 objc 更改为 swift。
创建 NSManagedObject 子类
我检查过的内容:
PersistentStore 的 URL 与上一个项目中的 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
()
【问题讨论】:
到底是什么问题? 我实际上无法访问以前应用程序保存的任何数据。每个 fetch 请求的结果都是空的。 @loup4 如果您已经解决了您的问题,请将其发布为作为答案,请不要为此目的编辑您的问题。 @GrumpyCrouton,好的! 【参考方案1】:PersistentStore 的 url 在当前和以前的项目中不相同。
我以为是,但不是。
MagicalRecord 的方法之一 - NSPersistentStore.MR_defaultLocalStoreUrl
- 返回了无效的 NSURL。
为了后代 - 通过 Xcode 设备管理器下载您应用的 IPA 并手动查找其 URL 的位置!
【讨论】:
以上是关于将核心数据数据库导入新项目的主要内容,如果未能解决你的问题,请参考以下文章
如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1