CoreData:找不到 NSEntityDescription 的唯一匹配项
Posted
技术标签:
【中文标题】CoreData:找不到 NSEntityDescription 的唯一匹配项【英文标题】:CoreData: Failed to find a unique match for an NSEntityDescription 【发布时间】:2021-08-10 22:18:01 【问题描述】:我相当肯定 CoreData 会抛出标题错误,因为函数 addNewGoal
中的行 let newGoal = Goal(context: viewContext)
。但我不知道另一种方式来“改写”我的功能。
*** 中相同错误的搜索结果似乎与我的问题无关。 (一个是用静态var代替lazy var解决的;另一个是关于这个错误随机发生的)
在此先感谢
(抱歉,如果这是一个愚蠢的问题。我是一个通过构建项目来学习的初学者。CoreData 对我的项目概念至关重要,但我完全超出了我的深度,它让我死了。)
import CoreData
struct PersistenceController
static let shared = PersistenceController()
static var preview: PersistenceController =
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
for _ in 0..<10
let newItem = Goal(context: viewContext)
do
try viewContext.save()
catch
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
return result
()
let container: NSPersistentContainer
init(inMemory: Bool = false)
container = NSPersistentContainer(name: "Project")
if inMemory
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
container.loadPersistentStores(completionHandler: (storeDescription, error) in
if let error = error as NSError?
fatalError("Unresolved error \(error), \(error.userInfo)")
)
func addNewGoal()
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
let newGoal = Goal(context: viewContext)
newGoal.passed = true
newGoal.title = "New Goal \(Date())"
newGoal.date = Date()
func addNewFail()
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
let newGoal = Goal(context: viewContext)
newGoal.passed = false
newGoal.title = "New Goal \(Date())"
newGoal.date = Date()
错误
2021-08-11 05:05:44.981041+0800 Project[27243:1370905] [error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'Goal' so +entity is unable to disambiguate.
CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'Goal' so +entity is unable to disambiguate.
2021-08-11 05:05:44.981226+0800 Project[27243:1370905] [error] warning: 'Goal' (0x6000032cc370) from NSManagedObjectModel (0x6000026fa7b0) claims 'Goal'.
CoreData: warning: 'Goal' (0x6000032cc370) from NSManagedObjectModel (0x6000026fa7b0) claims 'Goal'.
2021-08-11 05:05:44.981343+0800 Project[27243:1370905] [error] warning: 'Goal' (0x6000032d5e40) from NSManagedObjectModel (0x6000026bc5f0) claims 'Goal'.
CoreData: warning: 'Goal' (0x6000032d5e40) from NSManagedObjectModel (0x6000026bc5f0) claims 'Goal'.
2021-08-11 05:05:44.981447+0800 Project[27243:1370905] [error] error: +[Goal entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[Goal entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
编辑:
【问题讨论】:
一种可能的解决方案是您需要清理 Xcode 中的构建文件夹并从头开始构建项目。当您更改核心数据模型时,有时会发生这种情况。 【参考方案1】:首先,摆脱:
let result = PersistenceController(inMemory: true)
换行并制作下一行:
let viewContext = container.viewContext
您已经将container
变量限定为整个结构,因此它在PersistenceController
结构中可用。
你的功能是这样的:
func addNewGoal()
let viewContext = container.viewContext
let newGoal = Goal(context: viewContext)
newGoal.passed = true
newGoal.title = "New Goal \(Date())"
newGoal.date = Date()
关于错误,根据this answer,问题是同时加载了两个模型,通过调用PersistenceController(inMemory: true)
,我想你可能已经做到了。
此外,拥有shared
变量的全部意义在于,您只使用PersistenceController
的一个实例。您当然不想通过传递已初始化的 inMemory: true
来初始化它。
【讨论】:
感谢您的详细回复。 修复后的几个错误: 1. 到let viewContext = container.viewContext
行:“实例成员'container' 不能用于'PersistenceController' 类型;你的意思是使用这种类型的值吗? " 2. let newItem = Goal(context: viewContext)
行出现 2 个错误:“调用中的额外参数 'context'”和“调用中的参数 'entity'、'insertInto' 缺少参数” 3. (可以理解)return result
行:找不到result
在范围内
@WalterPak 你真的在使用这个答案中发布的代码吗?错误消息说你不是。
@WalterPak 注意此代码更改在 func addNewGoal() 和 func addNewFail() 中,不在预览代码中。【参考方案2】:
它说你定义了一个名为 Goal 的 NSManaged 对象的子类两次。它还说你定义了两个具有相同类的模型,但它不能告诉你想要哪一个。你能展示你的两个模型文件吗?
【讨论】:
感谢您的回复。我添加了 xcdatamodel 的图片。这就是模型文件的意思吗?我的项目中只有一个。 表示有两个模型实例。如果您只有一个模型,它应该只有一个实例。您是生成子类还是尝试在某个地方创建两个商店? 哦,好的,我知道发生了什么。上面的答案可能是正确的。我刚刚意识到你的函数在你的持久性控制器结构中。以上是关于CoreData:找不到 NSEntityDescription 的唯一匹配项的主要内容,如果未能解决你的问题,请参考以下文章
CoreData 错误:找不到类,而是使用默认的 NSManagedObject [重复]
CoreData:警告:无法为实体“任务”加载名为“任务”的类。找不到类,改用默认的 NSManagedObject
错误:将实体添加到 CoreData 时“在实体中找不到键路径索引”