0

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

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

2020-10-31 12:13:47.934507-0400 Bookworm[614:7766183] [error] 错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类“Bookworm.Student”,因此 +entity 被混淆了。你加载你的 NSManagedObjectModel 了吗?CoreData:错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类“Bookworm.Student”,因此 +entity 被混淆了。你加载你的 NSManagedObjectModel 了吗?2020-10-31 12:13:47.934651-0400 Bookworm[614:7766183] [error] 错误:+[Bookworm.Student entity] 无法找到 NSEntityDescription 与托管对象子类 CoreData 的唯一匹配:错误:+[ Bookworm.Student 实体] 无法找到 NSEntityDescription 与托管对象子类的唯一匹配项 2020-10-31 12:13:47.953419-0400 Bookworm[614:

我搜索了很多,并尝试了我发现的所有推荐解决方案,包括:简单地关闭并重新打开 Xcode(步骤 1),清理项目,然后重复步骤 1,删除所有派生数据并重复步骤 1。我已经验证在模块的检查器中选择了当前产品模块,并且 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")
                }
            }
        }
    }
 }
4

1 回答 1

2

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

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

import SwiftUI
import CoreData

@main
struct coreDataParadigmApp: App {
    let persistenceController = PersistenceController.shared
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}


struct ContentView: View {
    @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")
                }
            }
        }
    }
 }

// DONT FORGET TO CHANGE THE NAME OF YOUR FILE
struct PersistenceController {
    static let shared = PersistenceController()

    let container: NSPersistentContainer

    init() {
        container = NSPersistentContainer(name: "coreDataNameOfFile")

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
}
于 2020-10-31T18:09:52.503 回答