2017-05-30 93 views
0

我有一个框架项目,当我尝试单元测试我的类时得到那个奇怪的错误。 这里代码由Andrew Bancroft建议在内存NSManagedObjectContextSwift 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? 任何链接或框架项目中的核心数据使用的例子非常感谢。

回答

1

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

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

如果你在一个框架的时候,你的模型是不是在主束。你告诉它看错了位置,所以它没有找到模型文件。

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

+0

感谢您的回答汤姆,看起来它解决了上下文创建的问题,但现在还有另一个问题。它说:CoreData:警告:无法为实体“MyClass”加载名为“MyFramework.MyClass”的类。找不到类,使用默认的NSManagedObject来代替。 无法将'NSManagedObject_MyClass_'类型的值转换为'MyFramework.MyClass'有什么想法? MyClass是自动生成的公共类 – Vilen

+0

好了许多尝试做同样的事情,即删除xcdatamodeld模块,然后重新创建它开始在测试中工作的类。但仍然不能在实际项目中使用我的框架,因为它看不到xcdatamodeld。 – Vilen

相关问题