insertNewObjectForEntityForName的奇怪行为导致NSInternalInconsistencyException

时间:2014-06-22 20:34:14

标签: core-data swift

我有一个相当奇怪的例子,在试验Swift时遇到核心数据错误。我不确定它是否来自Swift(beta错误?)或者它是否是我。但是,这是我的测试用例的设置(在VTModelTests.swift中)。

var bundle = NSBundle(forClass: VTModelTests.self)
var url = bundle.URLForResource("VTDocument", withExtension:"momd")
appleModel = NSManagedObjectModel(contentsOfURL: url)
assert (appleModel != nil)
var coord = NSPersistentStoreCoordinator(managedObjectModel: appleModel);
var store = coord.addPersistentStoreWithType(NSInMemoryStoreType,configuration:nil,URL:nil,options:nil,error:nil);
assert (store != nil)
ctx = NSManagedObjectContext();
ctx!.persistentStoreCoordinator=coord
ctx!.retainsRegisteredObjects=true;

var drwName = "Drawing"
var descs = ctx!.persistentStoreCoordinator.managedObjectModel.entitiesByName
for e : AnyObject in descs.allKeys{
    assert (descs.objectForKey(e).name == e as String )
    if (e as String == drwName) {
        NSLog("yeah")
    }
}
model = NSEntityDescription.insertNewObjectForEntityForName(drwName,inManagedObjectContext: ctx) as Drawing

我的错误消息如下所示:

2014-06-22 22:12:25.584 xctest[63792:303] yeah
<unknown>:0: error: -[_TtC12VTModelTests12BaseTypeTest testTreeStructure] : failed: caught "NSInternalInconsistencyException", "+entityForName: could not locate an entity named 'Drawing' in this model."

简而言之,我可以“证明”实体名称存在(日志中的“是”),但核心数据显示的是该名称不在模型中的问题。循环的先前版本打印出实体并且看起来很好。我没有任何第二个版本,并且在打印所有实体时,在模型数据中正确显示新的更改名称('Model'现在称为'Drawing')。已编译的模型位于生成的包中。

任何人都可以解释一下吗?或者我是否必须等待Xcode 6的下一个测试版?还有什么我忽略了?非常感谢提前!

1 个答案:

答案 0 :(得分:6)

我可以确认这个问题。不是答案,但我使用的方法是将insertNewObjectForEntityForName拆分为:

let entity = NSEntityDescription.entityForName("Photo", inManagedObjectContext:context)
let photo = Photo(entity:entity, insertIntoManagedObjectContext:context)