ios 任何模型中的NSEntityDescriptions都不会声明NSManagedObject子类

oxosxuxt  于 2023-10-21  发布在  iOS
关注(0)|答案(9)|浏览(116)

我是Core Data的新手,我正在尝试创建一种缓存机制,在解析来自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

原因是什么呢?

7uhlpewt

7uhlpewt1#

如果您在使用SwiftUI时遇到类似的问题,可以尝试将实体的classmodule从 *Global Pace * 更改为 Current Product Module
转到xcdatamodeld文件并选择有问题的实体。然后在数据模型检查器中,通过单击字段右侧的箭头将Module字段从默认的 Global namespace 更改为可用值“Current Product Module”。
这使得我的应用程序编译时不会遇到错误。

uyhoqukh

uyhoqukh2#

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

@objc(Person)
public class Person: NSManagedObject {

}
cbwuti44

cbwuti443#

当我将 Core Data ModelCodegen 属性更改为类型 Category/Extension,为 Core Data Model 创建自定义类时,也遇到了同样的问题。
正如@dypbrg所指出的,更改以下代码段

Product.fetchRequest()

到下面的代码段

NSFetchRequest<Product>(entityName: "Product")

似乎解决了这个问题。

nr9pn0ug

nr9pn0ug4#

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

xiozqbni5#

对于任何在混合项目(Obj-C + Swift)中遇到这个问题的人来说。
在我的例子中,CoreData xcdatamodel是作为SPM包中的资产交付的,并在这个包中使用。使用Swift项目没有问题,但使用Hybrid项目时,我遇到了同样的问题。
解决我的问题的方法:
1.如@Sam所述,对NSManagedObjects使用@objc注解

@objc(Entity) 
 public class Entity: NSManagedObject {

 }

1.对每个实体使用全局命名空间而不是当前产品模块(检查@Pomme2Poule的答案如何做到这一点)

zkure5ic

zkure5ic6#

在我的例子中,我更改了一个实体和swift类的名称,但忘记了在xcdatamodeld中更新为新的swift类名称。
(In xcdatamodel视图,在左窗格的“CONFIGURATIONS”下,选择“Default”并确保类的名称正确。)

ha5z0ras

ha5z0ras7#

我也遇到过同样的问题,最后找到了persistentContainer lazy initilaize的根本原因。
在AppDelegate.swift中,删除lazy对我来说很有效。

// MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentCloudKitContainer = {...}
3b6akqbq

3b6akqbq8#

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

let container = NSPersistentContainer(name: "DataModel")
kupeojn6

kupeojn69#

我想添加在我的情况下,这个错误发生后,我已将我的xcdatamodeld和相关文件到另一个文件夹。删除和重新创建数据模型文件为我修复了它。
如果在移动某些文件后发生此错误,则可能是某些文件未正确移动。

相关问题