在任何模型中,没有NSEntityDescriptions声明NSManagedObject子类

dyp*_*brg 5 ios swift

我是CoreData的新手,我正在尝试创建一种缓存机制,其中从API解析对象之后,将它们保存到数据模型中,然后再次获取它以在tableview上显示它。我正在尝试使用获取它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
Run Code Online (Sandbox Code Playgroud)

可能是什么原因呢?

Pom*_*ule 32

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

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

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

更改模块字段

  • 我这样做了,但并没有解决我的问题。Codegen 应该如何定义?这有关系吗? (2认同)

Sam*_*Sam 10

我的经验:

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

@objc(Person)
public class Person: NSManagedObject {

}
Run Code Online (Sandbox Code Playgroud)


gay*_*nbc 9

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

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

Product.fetchRequest() 
Run Code Online (Sandbox Code Playgroud)

到以下代码段

NSFetchRequest<Product>(entityName: "Product")
Run Code Online (Sandbox Code Playgroud)

似乎解决了这个问题。


use*_*037 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

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

  1. 正如 @Sam 提到的,对 NSManagedObjects 使用 @objc 注释

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

核心数据


rag*_*ius 5

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

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