核心数据数据未保存

时间:2014-01-16 09:01:54

标签: ios iphone core-data

我目前正在开发一个使用Core Data存储数据的应用程序。应用程序通过下载和解析一个巨大的XML文件(大约40000个条目)来同步其内容和Web服务器。该应用程序允许用户搜索数据并对其进行修改(CRUD)。获取操作太重,这就是我决定使用以下模式的原因:

“主线程(NSMainQueueConcurrencyType)的一个托管对象上下文,以刷新用户界面。通过多个后台托管对象上下文(NSPrivateQueueConcurrencyType)完成大量获取和更新。不使用子上下文”。

我将一些对象提取到数组中(让我们说“用户”数组),然后我尝试在后台上下文中更新或删除一个“用户”(从填充的数组中获取对象“user”)最后我保存了这个背景。

我正在收听 NSManagedObjectContextDidSaveNotification 并将所有修改合并到我的主线程托管对象上下文中。

除非重新启动我的应用程序,否则每件事情都能正常工作,我意识到没有任何修改已被保存。

以下是一些解释使用模式的代码

  1. 主要管理对象上下文:

    -(NSManagedObjectContext *)mainManagedObjectContext {
    
    if (_mainManagedObjectContext != nil)
    {
        return _mainManagedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    
    _mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_mainManagedObjectContext setPersistentStoreCoordinator:coordinator];
    
    return _mainManagedObjectContext;
    

    }

  2. 后台管理对象上下文:

    -(NSManagedObjectContext *)newManagedObjectContext {
    
    NSManagedObjectContext *newContext;
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    
    newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [newContext performBlockAndWait:^{
    
        [newContext setPersistentStoreCoordinator:coordinator];
    }];
    
    return newContext;
    

    }

  3. 更新记录:

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    FootBallCoach *coach = [_coaches objectAtIndex:indexPath.row];
    coach.firstName = [NSString stringWithFormat:@"Coach %i",indexPath.row];
    
    NSManagedObjectContext *context = [[SDCoreDataController sharedInstance] newManagedObjectContext];
    [context performBlock:^{
    
        NSError *error;
        [context save:&error];
    
    
        if (error)
        {
            NSLog(@"ERROR SAVING : %@",error.localizedDescription);
        }
    
        dispatch_async(dispatch_get_main_queue(), ^{
            [self refreshCoaches:nil];
        });
    }];
    

    }

  4. 我错过了什么吗?我应该在保存背景上下文后保存我的主要托管对象上下文吗?

1 个答案:

答案 0 :(得分:1)

如果您的上下文配置了持久性存储协调器,则save应该将数据写入存储。如果您的上下文配置了另一个上下文作为父级,则save会将数据推送到父级。只有当保存了配置了持久存储协调器的最后一个父节点时,才会将数据写入存储。

  1. 检查您的后台上下文是否真的配置了持久性存储协调器。
  2. 检查-save:
  3. 的返回值和可能的错误
  4. 确保通过-performBlock...:方法使用背景上下文。
  5. 更新

    每次调用-newManagedObjectContext方法时,都会创建一个新的上下文。此上下文对您正在更新的FootBallCoach对象一无所知。您需要保存FootBallCoach对象所属的相同上下文。

    不要忘记每个对象属于一个且只有一个上下文。

    另外,请确保对您正在使用的对象的上下文保持强引用。