Swift 3 核心数据 NSInternalInconsistencyException entityForName 无法在此模型中找到名为 Foo 的实体

Posted

技术标签:

【中文标题】Swift 3 核心数据 NSInternalInconsistencyException entityForName 无法在此模型中找到名为 Foo 的实体【英文标题】:Swift 3 Core Data NSInternalInconsistencyException entityForName could not locate an entity named Foo in this model 【发布时间】:2017-05-30 17:33:28 【问题描述】:

我有一个框架项目,当我尝试对我的类进行单元测试时遇到了奇怪的错误。 这是Andrew Bancroft 建议的代码以进入内存NSManagedObjectContext

func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext 
    let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])!
    let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)

    do 
        try persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
     catch 
        print("Adding in-memory persistent store failed")
    

    let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator

    return managedObjectContext

但每当我尝试通过此代码插入对象(或任何其他数据库操作)时

 let newLocationMO = NSEntityDescription.insertNewObject(forEntityName: table, into: context) as! LocationMO

它因标题中提到的错误而崩溃。

我还尝试使用真实上下文进行测试,因此我将我的框架导入到一个临时项目并从 AppDelegate 自动生成的代码中获取上下文,但它崩溃并出现相同的错误,就好像它没有看到我的 .xcdatamodeld 定义一样。

注意:我检查了所有拼写错误,没有丢失任何文件。

也许框架项目中不允许有核心数据? 非常感谢框架项目中核心数据使用的任何链接或示例。

【问题讨论】:

【参考方案1】:

您可以在框架中使用 Core Data,但您需要确保您的代码知道它在框架中。最可能的问题来源是这一行:

let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])!

如果您在框架中,则您的模型不在主包中。你告诉它在错误的地方寻找,所以它没有找到模型文件。

您可能希望将其更改为 Bundle(for: type(of:self)),以便查看包含框架类的同一个包。

【讨论】:

感谢汤姆的回答,看起来它解决了上下文创建的问题,但现在还有另一个问题。它说:CoreData:警告:无法为实体“MyClass”加载名为“MyFramework.MyClass”的类。找不到类,而是使用默认的 NSManagedObject。无法将“NSManagedObject_MyClass_”类型的值转换为“MyFramework.MyClass”,知道为什么吗? MyClass 是自动生成的公共类 在多次尝试做同样的事情后确定,即删除 xcdatamodeld 模块,然后重新创建它开始在测试中工作的类。但仍然无法在实际项目中使用我的框架,看起来它没有看到 xcdatamodeld。

以上是关于Swift 3 核心数据 NSInternalInconsistencyException entityForName 无法在此模型中找到名为 Foo 的实体的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 核心数据问题 - 所有数据丢失

Swift 3 - 从核心数据中获取价值

Swift 3 核心数据获取问题

Swift 3 中的核心数据属性验证

需要帮助在 Swift 3 中过滤核心数据

使用 NSFetchedResultsController 核心数据重新排序 TableView 单元格 - Swift 3