核心数据未在managedObjectContext中保存和崩溃

时间:2013-11-28 03:06:54

标签: ios objective-c core-data ios7

n核心数据,我创建模型,然后生成NSManagedObjectContext子类,但我的实体表永远不会在SQLlite数据库中创建。我必须手工完成吗?

我的应用程序崩溃在这一行的主线程上:

// Save the data in core data
   UsersTest *coreDataUser =[NSEntityDescription insertNewObjectForEntityForName:@"UsersTest" inManagedObjectContext:self.managedObjectContext];

UsersTest实体是在XCode中创建的,我将UsersTest.h添加到我的控制器中。

是什么给出的?这是一个错误吗?我在上下文中断言我们也在主线程中。

我得到了这个例外:

NSException *    name:@"NSInternalInconsistencyException" reason:@"+entityForName: could not locate an entity named 'UsersTest' in this model."    0x0895ee20

我是否必须打开数据库或其他任何内容(请点击此链接:http://www.codigator.com/tutorials/ios-core-data-tutorial-with-example/

谢谢,真的卡住了。

我的appDelegate.m是这样的:

// 1
- (NSManagedObjectContext *) managedObjectContext {
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator: coordinator];
    }

    return _managedObjectContext;
}

//2
- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

    return _managedObjectModel;
}

//3
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                               stringByAppendingPathComponent: @"PhoneBook.sqlite"]];
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                               initWithManagedObjectModel:[self managedObjectModel]];
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                              configuration:nil URL:storeUrl options:nil error:&error]) {
    /*Error for store creation should be handled in here*/
}

return _persistentStoreCoordinator;
}

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

3 个答案:

答案 0 :(得分:0)

确保将名称大小与核心数据模型中显示的名称完全相同。您可能还想检查managedObjectContext是否为nil。

答案 1 :(得分:0)

在执行任何操作之前,您可能希望创建基于Master-Detail应用程序的新项目。它将配置Core Data的所有必需组件,并在AppDelegate.m文件中进行设置。

至少创建一个Master-Detail Application项目并确保项目中的AppDelegate以与Master-Detail Application项目相同的方式配置Core Data。这是开始使用Core Data的好方法。

否则请花点时间阅读:

  

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/coredata/cdProgrammingGuide.html

有时很难调试核心数据。关于Core Data的Apple文档至少可以说是彻底的。你可能会发现你哪里出错了。

修改1:

确保您的NSManagedObjectContext不是nil。如果是这样,您还将获得持久存储协调器未找到错误。

答案 2 :(得分:0)

您当前的堆栈看起来很好。如果您在任何时候更改了模型,则磁盘sqlite文件可能无效。

确保完全清理项目(Cmd-Shift-Alt-K)并为每次编辑CoreData模型重置模拟器(iOS模拟器>重置内容和设置...)。 / p>

每次更改模型时,磁盘上现有的sqlite文件都将与模型不兼容,从而变得不可读且不可写。

CoreData文件是upgradable,但仅限于某些方式,在进行初始开发时,最简单的升级方法是将所有内容分段并重新开始。