Swift 3核心数据NSInternalInconsistencyException entityForName在这个模型中找不到一个名为Foo的实体
问题描述:
我有一个框架项目,当我尝试单元测试我的类时得到那个奇怪的错误。 这里代码由Andrew Bancroft建议在内存NSManagedObjectContext
Swift 3核心数据NSInternalInconsistencyException entityForName在这个模型中找不到一个名为Foo的实体
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
定义。
注意:我检查了所有的拼写错误,并且没有文件丢失。
也许在框架项目中不允许有Core Data? 任何链接或框架项目中的核心数据使用的例子非常感谢。
答
您可以在框架中使用Core Data,但您需要确保您的代码知道它在框架中。故障最有可能的来源是这一行:
let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])!
如果你在一个框架的时候,你的模型是不是在主束。你告诉它看错了位置,所以它没有找到模型文件。
您可能想要将其更改为Bundle(for: type(of:self))
,以便您可以查看包含框架类的相同包。
感谢您的回答汤姆,看起来它解决了上下文创建的问题,但现在还有另一个问题。它说:CoreData:警告:无法为实体“MyClass”加载名为“MyFramework.MyClass”的类。找不到类,使用默认的NSManagedObject来代替。 无法将'NSManagedObject_MyClass_'类型的值转换为'MyFramework.MyClass'有什么想法? MyClass是自动生成的公共类 – Vilen
好了许多尝试做同样的事情,即删除xcdatamodeld模块,然后重新创建它开始在测试中工作的类。但仍然不能在实际项目中使用我的框架,因为它看不到xcdatamodeld。 – Vilen