我是核心数据新手,我正在尝试创建一种缓存机制,其中在从 API 解析对象后,我将它们保存到数据模型中,然后再次获取它以将其显示在表格视图上。我正在尝试使用
NSFetchedResultsController
获取它。在初始化 NSFetchedResultsController
时,我遇到了这个运行时异常:
2018-12-09 15:03:20.493509+0800 [5184:148001] [error] error:
No NSEntityDescriptions in any model claim the NSManagedObject subclass
'Product' so +entity is confused. Have you loaded your
NSManagedObjectModel yet ?
CoreData: error: No NSEntityDescriptions in any model claim the
NSManagedObject subclass 'Product' so +entity is confused. Have you
loaded your NSManagedObjectModel yet ?
2018-12-09 15:03:20.493718+0800[5184:148001] [error] error: +
[Product entity] Failed to find a unique match for an
NSEntityDescription to a managed object subclass
CoreData: error: +[Product entity] Failed to find a unique match for an
NSEntityDescription to a managed object subclass
可能是什么原因?
我的经历:
实体类缺少类名称上方的
@objc(Person)
行。
我确实有更多的类在没有这条线的情况下工作,但只有在创建这个特定实体时,我才收到此错误。
@objc(Person)
public class Person: NSManagedObject {
}
当我将 Core Data Model 的 Codegen 属性更改为 Category/Extension 类型,为 Core Data Model 创建自定义类时,我遇到了同样的问题.
正如@dypbrg所指出的,更改以下代码段
Product.fetchRequest()
到下面的代码段
NSFetchRequest<Product>(entityName: "Product")
似乎解决了问题。
在我的例子中,我使用的是 SwiftUI,在持久存储异步函数返回之前正在使用
NSManagedObjectContext
。
然后我使用 Xcode 跟踪核心数据示例项目来解决该问题:
@main
struct TestCoreDataApp: App {
//Inside the PersistenceController initialiser the store is loaded, so gives it time before passing the context to the SwiftUI View
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
}
}
}
就我而言,我更改了实体和 swift 类的名称,但忘记在 xcdatamodeld 中更新为新的 swift 类名称。
(在 xcdatamodel 视图中,在左窗格中的“配置”下,选择“默认”并确保类的名称正确。)
我遇到了同样的问题,最终在
persistentContainer
惰性初始化中找到了根本原因。
在 AppDelegate.swift 中,删除
lazy
对我有用。
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentCloudKitContainer = {...}
对于我来说,我没有在 AppDelegate 中将 NSPersistentContainer 命名为与我创建的 xcdatamodelId 相同的名称。
let container = NSPersistentContainer(name: "DataModel")
我想补充一下,在我将
xcdatamodeld
和相关文件移动到另一个文件夹后,发生了此错误。删除并重新创建数据模型文件为我解决了这个问题。
如果在移动某些文件后出现此错误,则某些文件可能未正确移动。