将核心数据数据库导入新项目

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 的位置!

【讨论】:

以上是关于将核心数据数据库导入新项目的主要内容,如果未能解决你的问题,请参考以下文章

将核心数据添加到 iPhone 项目

如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1

对核心数据的担忧

如何将项目导入eclipse中,有个SQL文件又如何导入数据库??

将核心数据从一个项目转移到另一个项目

将 Oracle 数据库导入数据库项目