【问题标题】:Xcode 11.4.1 Core Data model not recognisedXcode 11.4.1 Core Data 模型无法识别
【发布时间】:2020-05-24 20:39:36
【问题描述】:

我正在尝试将核心数据添加到我现有的项目中(我使用的是 Xcode 11.4.1)。所以我在我的 AppDelegate 文件中添加了以下内容:

    // MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {

    let container = NSPersistentContainer(name: "DataModel")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {

            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {

            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

到目前为止,我有以下简单模型:

我已经在我的 AppDelegate 和我的 ViewController 中导入了 CoreData。但是,我似乎无法访问这个新模型。当我尝试按如下方式创建它的实例时:

let newSheet = RefuelSheet()

我只是得到一个“未解析的标识符”错误。

我的理解是,因为我选择了“类定义”,所以相关的类将由 XCode 自动创建,我将能够访问该对象。

我已经尝试清理项目并构建以进行测试,但仍然没有成功。

我还检查了数据模型文件肯定与它在 AppDelegate 中定义的持久容器具有相同的名称。

【问题讨论】:

  • 除了使用默认初始化器创建实例会导致错误的问题。
  • 谢谢@vadian,那我该怎么做呢?
  • 您必须使用指定的初始化程序之一,但正如我所说,它与您的问题没有直接关系。
  • 是的,事情就是这样——我知道我必须改变那个初始化,但我希望它至少能够识别对象类型。另外,我尝试搜索我认为会在 Library - Developer - Xcode - DerivedData - my project - Build - Intermediates - my project.build 下的类文件,但它们不存在

标签: swift xcode class core-data


【解决方案1】:

Xcode 11.4

我创建了一个新项目并像您一样创建了您的xcdatamodel,并将 Codegen 设置为 Class Definition。唯一的例外是数据模型检查器中的 Module 字段被清除并设置为 Global namespace

构建项目后,编译器无法识别RefuelSheet 类。同样遵循清洁+构建。但是,我关闭了 Xcode,在重新打开和构建后,该类被识别出来了。

如果这不起作用,请尝试手动创建类:

选择您的 xcdatamodel > 编辑器 > 创建 NSManagedObject 子类

构建项目,它应该会告诉您类被创建了两次。现在,删除手动生成的类并再次清理 + 构建。

就个人而言,我总是对CoreData 类使用手动代码生成,因为它可以对类型(尤其是关系)和自定义函数进行更细粒度的控制。

顺便说一句,当您创建CoreData 类的实例时,您需要使用指定的初始化程序之一,通常是(context:)

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let moc = appDelegate.persistentContainer.viewContext

let newSheet = RefuelSheet(context: moc)

【讨论】:

  • 谢谢!我重新启动了xcode,它马上就找到了!!!我应该知道旧的“关闭然后再打开”会是答案哈哈。再次感谢
猜你喜欢
  • 2017-12-10
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多