无法找到 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
- 如果我将模块设置为当前产品模块(没有变化)
- 没有任何改变如果我更换:
- fetchRequest:NSFetchRequest = CDDetail.fetchRequest()
来自
- fetchRequest = NSFetchRequest(entityName:"CDDetail")
- 如果我将 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
共享并在您创建它的任何地方使用相同的实例,但我没有深入研究您的解决方案,因此供您考虑。
当我使用我的应用程序时,有时会出现一个错误,它似乎是随机出现的(或者我没有弄清楚确切的时间...),然后我的所有列表都是空的(好像什么都没有在 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
- 如果我将模块设置为当前产品模块(没有变化)
- 没有任何改变如果我更换:
- fetchRequest:NSFetchRequest = CDDetail.fetchRequest()
来自
- fetchRequest = NSFetchRequest(entityName:"CDDetail")
- 如果我将 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
共享并在您创建它的任何地方使用相同的实例,但我没有深入研究您的解决方案,因此供您考虑。