【问题标题】:CoreData bug in Xcode 12.1Xcode 12.1 中的 CoreData 错误
【发布时间】:2021-02-13 19:59:55
【问题描述】:

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

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

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 entity] 无法找到 NSEntityDescription 与托管对象子类的唯一匹配 2020-10-31 12:13:47.953419-0400 Bookworm[614:7766183] [SwiftUI] 环境中的上下文未连接到持久存储协调器:<0x6000008d0820>

&lt;&gt;

标签: core-data swiftui nsmanagedobject nsmanagedobjectcontext nsmanagedobjectmodel


【解决方案1】:

如果您使用的是 SwiftUI 生命周期,则应在父 View(或 App)中初始化 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)")
            }
        })
    }
}

【讨论】:

  • 感谢 Nikos 抽出宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 2019-11-30
  • 2020-04-13
  • 1970-01-01
  • 2013-12-17
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多