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找不到模型

CoreData:警告:无法为实体“任务”加载名为“任务”的类。找不到类,改用默认的 NSManagedObject

错误:将实体添加到 CoreData 时“在实体中找不到键路径索引”

CoreData 在 OSX 框架包中找不到映射模型,但在 iOS 中可以正常工作

在 CoreData 中使用 NSManagedObject 子类找不到 xcode8 标头