【问题标题】:Must have a valid NSEntityDescription (SwiftUI)必须有一个有效的 NSEntityDescription (SwiftUI)
【发布时间】:2021-01-15 05:19:02
【问题描述】:

错误

我今天第一次开始使用 CoreData,但一直遇到这个错误。

Thread 1: "An NSManagedObject of class 'MenuRPG.Inventory' must have a valid NSEntityDescription."

但是,我不确定如何解决这个问题。

我尝试过的:

  • 将实体模块更改为Current Product Module
  • 检查实体名称和类名称
  • 删除我的实体并重新制作它

但每次我尝试将新信息添加到我的数据模式时,我的应用程序都会崩溃并显示该错误。

我的代码:

import SwiftUI

struct BagMenu: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Inventory.entity(), sortDescriptors: []) var items:
        FetchedResults<Inventory>
    
    var body: some View {
        VStack {
            List {
                ForEach(items, id: \.id) { item in
                    Text(item.name ?? "Unnamed")
                }
            }
            
            Button("Bake") {
                let breadPrefix = ["Half-baked", "Decent", "Perfect"]
                let breadTypes = ["rye", "sourdough", "bagel"]
                
                let chosenPrefix = breadPrefix.randomElement()!
                let chosenBread = breadTypes.randomElement()!
                
                let item = Inventory(context: self.moc)
                item.id = UUID()
                item.name = "\(chosenPrefix) \(chosenBread)"
                
                try? self.moc.save()
            }
        }
    }
}

任何帮助将不胜感激!

【问题讨论】:

  • 您可以修改您的代码以使用@FetchRequest(sortDescriptors: []) private var items: FetchedResults&lt;Inventory&gt; 并尝试吗?

标签: swift core-data swiftui


【解决方案1】:

您能否检查以下是否有效:

检查 NSPersistentContainer 名称

  • 您使用的NSPersistentContainer 名称是什么(检查初始化程序)?是否与xcdatamodeld 文件名匹配?

检查应用代码

  • 在使用之前初始化PersistenceController非常重要。
  • 以便加载实体。 如果您使用的是 SwiftUI App 生命周期,请检查以下内容:

例子:

import SwiftUI

@main
struct TestCoreDataApp: App {
    //This is very important to initialise `PersistenceController` before using it. So that the entities are loaded.
    let persistenceController = PersistenceController.shared

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

清除缓存:

  • Xcode 缓存实体类,有时这可能会导致问题。
  • 尝试 Xcode > 产品 > 清理构建文件夹(Command Shift K)。 (或删除 DerivedData 文件夹的内容)。
  • 删除模拟器/设备上的应用
  • 退出 Xcode 并重新打开并运行。

示例项目:

  • 如果您是 CoreData 的新手,使用示例 CoreData 项目可能会有所帮助。
  • Xcode > 新建项目 > 选中 CoreData 复选框

文档

阅读 CoreData 文档可能会有所帮助。是的,这可能很耗时,但从长远来看可能会有所帮助。

【讨论】:

  • 感谢您的回答!但是,我在使用该代码时仍然遇到同样的错误,我目前正在尝试将 CoreData 添加到现有项目中。你知道我还能尝试什么吗?对于后续问题,我深表歉意。
  • Xcode 缓存实体类,有时这可能会导致问题,请尝试 Xcode > Product > Clean Build Folder (Command Shift K)。删除模拟器/设备上的应用,退出Xcode再试一次
  • 我清理了我的构建文件夹,卸载了我的应用程序,然后重新安装了它,但我仍然收到同样的错误。
  • 它似乎适用于示例项目吗?如果是这样,您能否查看示例项目中的 PersistenceController struct 并查看与您的代码相反的初始化和加载方式?
  • 您使用的 NSPersistentContainer 名称是什么?是否与xcdatamodeld 文件名匹配?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2018-01-08
  • 2018-11-08
  • 1970-01-01
  • 2021-03-28
  • 2016-09-15
  • 1970-01-01
相关资源
最近更新 更多