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

Posted

技术标签:

【中文标题】核心数据未在 managedObjectContext 中保存和崩溃【英文标题】:Core-data not saving and crashing in managedObjectContext 【发布时间】:2013-11-28 03:06:53 【问题描述】:

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];

【问题讨论】:

你能用一个名为 UsersTest 的实体来展示你的模型吗? 这是模型screencast.com/t/mPJzplcMgR 所以坚持了几天 xcdatamodeld 文件是否添加到了正确的 Xcode 目标中? 没有持久存储意味着没有 sqlite 数据库。在下面查看我的答案。创建一个新项目作为主从应用程序将展示如何在 AppDelegate 中配置核心数据。 【参考方案1】:

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

【讨论】:

您是否使用新实体更新了 xcdatamodelid? 在上面的 cmets 中添加了屏幕截图【参考方案2】:

在做任何事情之前,您可能需要创建一个基于主从应用程序的新项目。它将配置 Core Data 的所有必需组件并在 AppDelegate.m 文件中设置它们。

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

否则花时间阅读:

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

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

编辑 1:

确保您的 NSManagedObjectContext 不为零。如果是这样,您还将收到一个未找到持久存储协调器的错误。

【讨论】:

主从应用程序中是否包含核心数据,我是否需要像在我的应用程序中一样重新设置所有这些数据? 主从应用程序将 Core Data 设置为随时可用的状态。如果是全新项目,则无需再进行配置。您的 managedObjectModel 似乎正在使用捆绑合并进行自身初始化。只是为了确保它不是模型,请尝试将 _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 替换为 NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"teste" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 并将“teste”替换为您的模型名称(例如 teste.xcdatamodeld)。【参考方案3】:

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

确保您正在对项目进行全面清理 (Cmd-Shift-Alt-K) 并在每次编辑 CoreData 模型时重置您的模拟器(iOS 模拟器 > 重置内容和设置...)。

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

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

【讨论】:

以上是关于核心数据未在 managedObjectContext 中保存和崩溃的主要内容,如果未能解决你的问题,请参考以下文章

核心数据未在表视图中获取

核心数据:未在子实体上创建复合索引

iPhone 核心数据 - 获取的托管对象未在设备上发布(在模拟器上很好)

NSPredicate 未在 CoreData 中返回 Int32

NSPersistentStoreDidImportUbiquitousContentChangesNotification 未在任一 iOS 设备上触发

Swagger UI 未在 azure .net 核心中生成,但在本地工作