将Core Data数据库导入新项目

3

我正在将一个Objective-C编写的应用程序重写为Swift,并在另一个项目中进行。在导入核心数据数据库时出现了问题(获取请求返回空结果),而在以前的项目中这些操作是由MagicalRecord处理的。

以下是我的操作步骤:

  1. 将数据库模型文件复制到新项目中。

  2. 在Build Phases中将该模型文件添加到Compile Sources和Copy Bundle Resources中。

  3. 在模型文件中将实体的代码生成语言从objc更改为swift。

  4. 创建NSManagedObject子类。

我已经检查过的事项:

  • PersistentStore的URL与之前的项目相同(除了沙盒的应用程序标识符)。
  • 模型文件的名称与之前的项目相同。
  • 目标、方案、项目和包标识符与之前的项目相同。
  • 整个核心数据堆栈的初始化(下面的代码)没有错误。

以下是如何初始化堆栈(当然,这里的字符串我已经更改了,因为它们在项目中有效):

    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
    }()

1
到底是什么问题? - pbasdf
我实际上无法访问先前应用程序保存的任何数据。每个获取请求的结果都为空。 - loup4
如果您已经解决了问题,请将其作为答案发布,不要编辑您的问题以此为目的。 - GrumpyCrouton
@GrumpyCrouton,好的! - loup4
1个回答

0

PersistentStore的URL在当前项目和之前的项目中不同

我以为它是一样的,但实际上并不是。 MagicalRecord的一个方法 - NSPersistentStore.MR_defaultLocalStoreUrl - 返回了无效的NSURL。

对于未来的开发者们 - 通过Xcode设备管理器下载你的应用程序的IPA文件,并手动查找其URL!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接