12

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

我在堆栈溢出上搜索了这个问题,但对我来说什么都不清楚......

错误 :

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 模型 CD模型

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

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

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

经过

  • fetchRequest = NSFetchRequest(entityName:"CDDetail")
  1. 如果我将 codeGen 设置为 Category/Extension,它不会构建并给我很多错误: 错误
4

1 回答 1

13

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

使用 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在您创建它的任何地方共享和使用相同的实例,但我没有深入研究您的解决方案,因此供您考虑。

于 2020-11-17T05:50:36.670 回答