在核心数据中保存到托管对象上下文时的 SIGABRT

Posted

技术标签:

【中文标题】在核心数据中保存到托管对象上下文时的 SIGABRT【英文标题】:SIGABRT when saving to managed object context in core data 【发布时间】:2013-11-26 08:22:47 【问题描述】:

此代码应该将我的数据保存到 TestViewController.m 文件中的核心数据:

//Property
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;


//Methods
- (void)saveUser:(NSString *) username withEmail:(NSString *) email withName:(NSString *) name

    //1
    AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
    //2
    self.managedObjectContext = appDelegate.managedObjectContext;

    User *coreDataUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext];

    coreDataUser.username = username;
    coreDataUser.email = email;
    coreDataUser.name = name;

    NSError *error;

    if (![self.managedObjectContext save:&error])
    
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    


//In my save user method I have stuff that is done in another thread but then this is called:

// Add in any UIKit code here on main queue
    dispatch_async(dispatch_get_main_queue(), ^

        if (isUnique == YES)
        
            [self saveUser:[emailStr lowercaseString] withEmail:emailStr withName:nameStr];

我的代码总是崩溃:

ser *coreDataUser = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.managedObjectContext];

它在 main 中显示信号 SIGABRT。

我正在关注本教程:http://www.codigator.com/tutorials/ios-core-data-tutorial-with-example/

并在 ios 7 中运行。

我错过了什么?

我现在正在跟踪 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;
    

    NSString *test = [self applicationDocumentsDirectory];
    NSString *test2 = test;

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"HappyPeople.sqlite"]];

    NSError *error = nil;

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

i    f (![_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];

好像创建了 sqllite db 文件。

我得到的例外是:

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

【问题讨论】:

appDelegate.managedObjectContext 为零吗? 好的起点,我会测试 hmmm 必须与上下文的创建有关。我遵循了 URL 中的内容,它们从零开始,但它们应该像在链接中一样创建 如果它是 AppDelegate 中的代码,扔掉它也无妨;) 好的,我现在就这样做 【参考方案1】:

我知道这个问题有点老了……

这是我在更改对象模型的架构并尝试使用具有旧架构的文件时遇到的异常。磁盘上的 sqllite db 可能与您的应用程序架构不匹配。

我一直在使用带有 UIManagedDocument 的 CoreData,所以它有点不同。在那里,您可以选择在开放时自动迁移。

此外,在 cmets 早期,有人询问 ManagedObjectContext 是否为 nil。我相信在调用插入之前应该检查这一点。我们确定所有核心数据设置都在主队列上吗?打开可能需要一点时间。 (再次使用 UIManagedDocument 明确在另一个线程上。)

【讨论】:

以上是关于在核心数据中保存到托管对象上下文时的 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:托管对象与上下文一起保存后如何撤消操作

核心数据 - 管理上下文

核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

核心数据单一托管对象上下文和两个线程

撤消核心数据托管对象

核心数据和托管对象上下文