Core data Xcode 12.1中的CoreData错误

Core data Xcode 12.1中的CoreData错误,core-data,swiftui,nsmanagedobject,nsmanagedobjectcontext,nsmanagedobjectmodel,Core Data,Swiftui,Nsmanagedobject,Nsmanagedobjectcontext,Nsmanagedobjectmodel,我正在研究Paul Hudson的100天SwiftUI,项目11遇到了CoreData的一个令人沮丧的问题。这是Paul代码的直接提升,在他的视频中编译并运行良好。Bookworm.xcdatamodeld有一个名为Student的实体,它有两个属性:一个名为id的UUID和一个名为name的字符串 它编译得很好,但运行它会导致ForEach崩溃,其中“学生”用红色下划线。控制台中弹出的错误消息显示: 2020-10-31 12:13:47.934507-0400 Bookworm[614:7

我正在研究Paul Hudson的100天SwiftUI,项目11遇到了CoreData的一个令人沮丧的问题。这是Paul代码的直接提升,在他的视频中编译并运行良好。Bookworm.xcdatamodeld有一个名为Student的实体,它有两个属性:一个名为id的UUID和一个名为name的字符串

它编译得很好,但运行它会导致ForEach崩溃,其中“学生”用红色下划线。控制台中弹出的错误消息显示:

2020-10-31 12:13:47.934507-0400 Bookworm[614:7766183][error]错误:任何模型中都没有NSEntityDescriptions声明NSManagedObject子类“Bookworm.Student”so+实体混淆。您已经加载了NSManagedObjectModel吗? CoreData:错误:任何模型中都没有NSEntityDescriptions声明NSManagedObject子类“Bookworm.Student”so+实体混淆。您已经加载了NSManagedObjectModel吗? 2020-10-31 12:13:47.934651-0400 Bookworm[614:7766183][error]错误:+[Bookworm.Student entity]未能找到NSEntityDescription与托管对象子类的唯一匹配项 CoreData:错误:+[Bookworm.Student entity]未能找到NSEntityDescription与托管对象子类的唯一匹配项 2020-10-31 12:13:47.953419-0400环境中的Bookworm[614:7766183][SwiftUI]上下文未连接到持久存储协调器:

我搜索了很多,并尝试了我找到的所有推荐解决方案,包括:简单地关闭并重新打开Xcode(步骤1),清理项目,然后重复步骤1,删除所有派生数据并重复步骤1。我已经验证了在模块的inspector中选择了当前产品模块,并且Codegen已经选择了类定义

import SwiftUI
import CoreData

struct ContentView: View {

    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Student.entity(), sortDescriptors: []) var students: FetchedResults<Student>

    var body: some View {
        VStack {
            List {
                ForEach(students, id: \.id) { student in
                    Text(student.name ?? "Unknown")
                }
            }
        }
    }
 }
导入快捷界面
导入CoreData
结构ContentView:View{
@环境(\.managedObjectContext)变量moc
@FetchRequest(实体:Student.entity(),sortDescriptors:[])var students:FetchedResults
var body:一些观点{
VStack{
名单{
ForEach(学生,id:\.id){学生在
文本(学生名??“未知”)
}
}
}
}
}

如果您使用的是SwiftUI lifecycle,则应在父视图(或应用程序)中初始化NSPersistentContainer,并将managedObjectContext导入到环境中

在您的情况下,可能是这样的:

导入快捷界面
导入CoreData
@主要
结构coreDataParadigmApp:App{
让persistenceController=persistenceController.shared
var body:一些场景{
窗口组{
ContentView()
.environment(\.managedObjectContext、persistenceController.container.viewContext)
}
}
}
结构ContentView:View{
@FetchRequest(实体:Student.entity(),sortDescriptors:[])var students:FetchedResults
var body:一些观点{
VStack{
名单{
ForEach(学生,id:\.id){学生在
文本(学生名??“未知”)
}
}
}
}
}
//别忘了更改文件名
结构持久性控制器{
静态let shared=PersistenceController()
let容器:nspersistent容器
init(){
容器=NSPersistentContainer(名称:“coreDataNameOfFile”)
中的container.loadPersistentStores(completionHandler:{(storeDescription,错误)
如果let error=错误为N错误{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
})
}
}

如果您使用的是SwiftUI lifecycle,则应在父视图(或应用程序)中初始化NSPersistentContainer,并将managedObjectContext导入到环境中

在您的情况下,可能是这样的:

导入快捷界面
导入CoreData
@主要
结构coreDataParadigmApp:App{
让persistenceController=persistenceController.shared
var body:一些场景{
窗口组{
ContentView()
.environment(\.managedObjectContext、persistenceController.container.viewContext)
}
}
}
结构ContentView:View{
@FetchRequest(实体:Student.entity(),sortDescriptors:[])var students:FetchedResults
var body:一些观点{
VStack{
名单{
ForEach(学生,id:\.id){学生在
文本(学生名??“未知”)
}
}
}
}
}
//别忘了更改文件名
结构持久性控制器{
静态let shared=PersistenceController()
let容器:nspersistent容器
init(){
容器=NSPersistentContainer(名称:“coreDataNameOfFile”)
中的container.loadPersistentStores(completionHandler:{(storeDescription,错误)
如果let error=错误为N错误{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
})
}
}

在哪里初始化managedObjectContext?根据教程:我们不需要创建这个托管对象上下文,因为Xcode已经为我们创建了一个。更好的是,它已经将它添加到SwiftUI环境中,这就是@FetchRequest属性包装器工作的原因——它使用环境中可用的任何托管对象上下文。在添加和保存对象时,我们需要访问SwiftUI环境中的托管对象上下文。这是@Environment property wrapper的另一个用途–我们可以要求它提供当前的托管对象上下文,并将其分配给一个属性供我们使用。如果您确实使用Xcode模板作为核心数据,这是准确的。如果你没有,你将不得不自己实施它。检查SceneDelegate文件,如果有这样一行:window.rootViewController=UIHostingController(rootView:contentView)(如果您将应用程序上载到github,请向我发送一个链接以检查代码。)我正在使用SwiftUI生命周期