无法找到 NSEntityDescription CoreData Swiftui 的唯一匹配项

Failed to find a unique match for an NSEntityDescription CoreData Swiftui

当我使用我的应用程序时,有时会出现一个错误,它似乎是随机出现的(或者我没有弄清楚确切的时间...),然后我的所有列表都是空的(好像什么都没有在 CoreData 中)。 但是如果我关闭我的应用程序并重新打开它,列表会毫无问题地出现...

我在 stack overflow 上搜索了这个问题,但我什么都不清楚...

错误:

CoreData: warning:       'CDDetail' (0x2815e8790) from NSManagedObjectModel (0x2841bb8e0) claims 'CDDetail'.
2020-11-13 19:16:48.329773+0100 OrientationEPS[33705:3479327] [error] error: +[CDDetail entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[CDDetail entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass

正在加载持久容器:

class OriEPS {

lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "OrientationEPS")
        container.loadPersistentStores { description, error in
            if let error = error {
                 fatalError("Unable to load persistent stores: \(error)")
            }
        }
        return container
    }()

var context: NSManagedObjectContext {
    return persistentContainer.viewContext
}

这是我获取结果的函数:

private func fetchCDDetail(withId detailId:UUID) -> CDDetail? {
    let fetchRequest = NSFetchRequest<CDDetail>(entityName: "CDDetail")
    fetchRequest.predicate = NSPredicate(format: "id == %@", detailId as CVarArg)
    fetchRequest.fetchLimit = 1
    let fetchResult:[CDDetail]? = try? context.fetch(fetchRequest)
    return fetchResult?.first
}

我的CD型号

2 个问题: 我应该如何解决这个错误? 0x2815e8790 是什么意思?

编辑 1 : 我找不到任何其他 class 调用 CDDetail

  1. 如果我将模块设置为当前产品模块(没有变化)
  2. 没有任何改变如果我更换:

来自

  1. 如果我将 codeGen 设置为 Category/Extension,它不会构建并给我很多错误:

您多次加载模型 - 这就是这些错误的原因。可能的解决方案是使容器静态化。

使用 Xcode 12.1 / iOS 14.1 测试 - 没有错误:

class OriEPS {
    
    
   private static var persistentContainer: NSPersistentContainer = {
            let container = NSPersistentContainer(name: "CDOriEPS")
            container.loadPersistentStores { description, error in
                if let error = error {
                     fatalError("Unable to load persistent stores: \(error)")
                }
            }
            return container
        }()
    
    var context: NSManagedObjectContext {
        return Self.persistentContainer.viewContext
    }

    // ... other code

注意:其他可能的方法是使 OriEPS 共享并在您创建它的任何地方使用相同的实例,但我没有深入研究您的解决方案,因此供您考虑。

backup