insertNewObjectForEntityForName返回nil

时间:2012-10-19 14:49:02

标签: objective-c ios core-data insert

我一直在使用Core Data,因为它是针对iOS发布的,但是我无法弄清楚我的一个实体的insertNewObjectForEntityForName方法调用是怎么回事。调用该方法时,它只返回一个 nil 对象,并且不会抛出异常。

以下是代码:

@try {
    self.observation = [NSEntityDescription insertNewObjectForEntityForName:@"Observation" inManagedObjectContext:moc];
    NSLog(@"No exception on insert");
}
    @catch (NSException *exception) {
    NSLog(@"Insert exception - %@", exception.description);
}
NSLog(@"observation: %@", self.observation ? self.observation.description : @"nil");

这是输出:

2012-10-19 10:16:08.749 Track[63779:c07] No exception on insert
2012-10-19 10:16:08.750 Track[63779:c07] observation: nil

我可以在我的ERD中的所有其他实体上执行插入操作。只是这个嘲笑(双关语)我。

2 个答案:

答案 0 :(得分:1)

(Xcode 7.2 Swift项目)重命名实体后,我的数据模型变得混乱,并在执行insertNewObjectForEntityForName时开始返回nil个对象。以下是我为解决这个问题所做的三件事:

  1. 我首先使用了@PhillipMills的建议:po mainQueueContext.persistentStoreCoordinator?.managedObjectModel 在输出中,我看到“managedObjectClassName”是带有项目前缀的旧实体/类名。

      

    ... NewEntityName =“(< NSEntityDescription:0x7f9773783440>)名称DetectedData,managedObjectClassName MyProject.OldEntityName,...

  2. 为了尝试解决此问题,我删除并重新创建了实体。但是这也在插入时返回了nil个对象。我查看了界面构建器,发现Class字段是空白的。我设置了类名来解决这个问题。 Xcode Data Model Inspector

  3. 在此过程中的某个时刻,Xcode生成的Swift文件有第三个问题:
  4. 缺少objc()声明:

    import Foundation
    import CoreData
    
    class NewEntityName: NSManagedObject {
        // Insert code here to add functionality to your managed object subclass
    }
    

    修正版:

    import Foundation
    import CoreData
    
    @objc(NewEntityName) //THIS WAS MISSING
    class NewEntityName: NSManagedObject {
        // Insert code here to add functionality to your managed object subclass
    }
    

答案 1 :(得分:0)

没有看到任何错误,除非你在某些或所有情况下覆盖-description以返回@“nil” - 我会怀疑.... :) ps,如果你在try中记录observe.description怎么办?方框?

修改 将此评论发布为答案,以便您接受。不记录nil对象打印出来(null)?事实上,你必须在NSManagedObject的描述方法中字面上记录@“nil”。没有? ;)

或者,这可能是一些错误问题吗?在ternary子句中记录不同的文字而不是.description(log @“是”:@“No”)来检查它是否是属性问题。