insertNewObjectForEntityForName:

时间:2009-11-23 03:12:57

标签: objective-c iphone core-data

我使用Xcode .xcdatamodel文件编辑器设置了一个实体。我创建了一个名为Person的实体,添加了一些属性,然后生成了一个.m文件来表示它。一切正常。

现在我去写一行代码,如:

  Person * person = (Person*)[NSEntityDescription
                        insertNewObjectForEntityForName:@"Person"
                        inManagedObjectContext:managedObjectContext];

我得到了:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法找到实体名称'Person'的NSManagedObjectModel

我完全遵循了位置示例,我相信一步一步,但我认为必须错过某种关键的“注册”步骤,我告诉Xcode我的Person实体应该可访问..而且我根本没有办法“初始化”managedObjectContext,Location示例似乎也没有这样做。

3 个答案:

答案 0 :(得分:15)

您没有设置MOC的事实几乎肯定是问题所在。更具体地说,这意味着您可能没有加载定义Person的MOM(托管对象模型)。代码中的某处你应该有这样的东西:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    

这样的事情:

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

这样的事情:

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator: coordinator];

我只是从Core Data模板的AppDelegate中复制行(如果你创建一个使用Core Data的新应用程序,你会得到什么)。

如果您拥有所有这些,请确保您的xcdatamodel列在构建的“编译源”步骤中。当然要确保Person实际上是xcdatamodel中的实体名称。实体名称与Class不同,但它们通常设置为相同。

答案 1 :(得分:3)

您需要核心数据的初始化

-(void)initCoreData{
        NSError *error;
        //Path to sqlite file.
        NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Level4.sqlite"];
        NSURL *url = [NSURL fileURLWithPath:path];

        //init the model
        NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

        //Establish the persistent store coordinator
        NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];

        if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]){

                NSLog(@"Error %@",[error localizedDescription]);

        }else{
                self.context = [[[NSManagedObjectContext alloc ] init ] autorelease];
                [self.context setPersistentStoreCoordinator:persistentStoreCoordinator];
        }

        [persistentStoreCoordinator release];
}

答案 2 :(得分:2)

您应该检查NSManagedObjectContext对象是否为nil。

e.g。

if (self.managedObjectContext == nil) {
    NSLog(@"NSManagedObjectContext is nil");
    return nil;
}