任何模型中都没有 NSEntityDescription 声明 NSManagedObject 子类

问题描述 投票:0回答:9

我是核心数据新手,我正在尝试创建一种缓存机制,其中在从 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

可能是什么原因?

ios core-data
9个回答
48
投票

如果您在使用 SwiftUI 时遇到类似的问题,您可以尝试将实体的类 moduleGlobal Namespace 更改为 Current Product Module

转到您的 xcdatamodeld 文件并选择有问题的实体。然后在数据模型检查器中,通过单击字段右侧的箭头,将模块字段从默认的全局命名空间更改为可用值“当前产品模块”。

这允许我的应用程序编译而不会遇到错误。


16
投票

我的经历:

实体类缺少类名称上方的

@objc(Person)
行。 我确实有更多的类在没有这条线的情况下工作,但只有在创建这个特定实体时,我才收到此错误。

@objc(Person)
public class Person: NSManagedObject {

}

11
投票

当我将 Core Data ModelCodegen 属性更改为 Category/Extension 类型,为 Core Data Model 创建自定义类时,我遇到了同样的问题.

正如@dypbrg所指出的,更改以下代码段

Product.fetchRequest() 

到下面的代码段

NSFetchRequest<Product>(entityName: "Product")

似乎解决了问题。


9
投票

在我的例子中,我使用的是 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)
        }
    }
}

9
投票

对于任何在混合项目(Obj-C + Swift)中遇到此问题的人。

在我的例子中,CoreData xcdatamodel 作为 SPM 包内的资产提供,并在该包内使用。对于 Swift 项目,没有问题,但对于混合项目,我遇到了同样的问题。

解决我的问题的解决方案:

  1. 如@Sam

    所述,对 NSManagedObjects 使用 @objc 注释
     @objc(Entity) 
     public class Entity: NSManagedObject {
    
     }
    
  2. 对每个实体使用全局命名空间而不是当前产品模块(检查@Pomme2Poule的答案如何做到这一点)


7
投票

就我而言,我更改了实体和 swift 类的名称,但忘记在 xcdatamodeld 中更新为新的 swift 类名称。

(在 xcdatamodel 视图中,在左窗格中的“配置”下,选择“默认”并确保类的名称正确。)


2
投票

我遇到了同样的问题,最终在

persistentContainer
惰性初始化中找到了根本原因。

在 AppDelegate.swift 中,删除

lazy
对我有用。

// MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentCloudKitContainer = {...}

1
投票

对于我来说,我没有在 AppDelegate 中将 NSPersistentContainer 命名为与我创建的 xcdatamodelId 相同的名称。

let container = NSPersistentContainer(name: "DataModel")

0
投票

我想补充一下,在我将

xcdatamodeld
和相关文件移动到另一个文件夹后,发生了此错误。删除并重新创建数据模型文件为我解决了这个问题。

如果在移动某些文件后出现此错误,则某些文件可能未正确移动。

© www.soinside.com 2019 - 2024. All rights reserved.