使用 Objective C 创建并从 Swift 获取的核心数据

Posted

技术标签:

【中文标题】使用 Objective C 创建并从 Swift 获取的核心数据【英文标题】:Core data created with Objective C and fetch from Swift 【发布时间】:2018-02-15 11:50:50 【问题描述】:

我有一个使用核心数据并用Objective C编写的应用程序。这里我们没有使用persistentContainer。

现在我们用 Swift 重写了完整的应用程序,这个应用程序正在使用 Realm。

我想将一个数据库实体从核心数据迁移到领域并在此之后删除核心数据文件。

lazy var persistentContainer: NSPersistentContainer = 

    let container = NSPersistentContainer(name: "HitList")
    container.loadPersistentStores(completionHandler:  (storeDescription, error) in
      if let error = error as NSError? 
        fatalError("Unresolved error \(error), \(error.userInfo)")
      
    )
    return container
  ()

 var personData: [NSManagedObject] = []
            let managedContext = self.persistentContainer.viewContext

            let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person")
            do 
                offlineData = try managedContext.fetch(fetchRequest)
             catch let error as NSError 
                print("Could not fetch. \(error), \(error.userInfo)")
            


            if  (personData.count) > 0  // Insert DB into Relam

            

我收到以下错误

错误:未能加载名为 HitList 的模型 CoreData:错误:无法加载名为 HitList 的模型

在获取期间引发以下错误。

无法获取。错误域=Foundation._GenericObjCError Code=0 "(null)", [:]

怎么了?

【问题讨论】:

你有核心数据对象的桥接头文件吗? 我在swift应用程序中没有Objective C的.h和.m文件是否需要? 可能有很多问题。如果您的模型没有更改,那么您似乎错误地加载了数据。您可以在代码中一步一步地查看正在发生的事情,这可能是用于初始化核心数据的大量代码......但您可以避免所有这些。只需将其保留在目标 C 中并使用桥接来快速迁移,而不是移植您无论如何都弃用的代码。为了让事情变得更好,我建议您使用旧代码创建一个新项目,并将其作为库/框架,然后可以将其包含在您的 swift 项目中。 【参考方案1】:

您遇到的问题是来自 Objective C 的 CoreData 堆栈将数据库保存到与 persistentContainer 不同的路径。因此,它不会找到它,因为它正在寻找不同的位置。 您可以连接设备并使用 iExplorer 检查它,您会看到。 要迁移它,您需要引用该位置。

【讨论】:

以上是关于使用 Objective C 创建并从 Swift 获取的核心数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Objective C 类调用 Swift 方法

将Swift类导入Objective c [复制]

无法在 Swift 项目中添加 Objective C 桥接头

无法在 Swift 项目中添加 Objective C 桥接头

尝试在 Swift 项目中使用 Objective C 可可豆荚,桥接文件编译为 Swift 代码

如何在 Swift 中使用两个 swift 文件和一个 Objective C 文件制作 ScollView