未保存核心数据数据

问题描述:

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

“主线程的一个托管对象上下文(NSMainQueueConcurrencyType),以刷新用户界面。大量读取和更新通过多个后台管理对象上下文(NSPrivateQueueConcurrencyType)。不使用儿童上下文“。我试图更新或删除一个“用户”(对象“用户”是从填充数组中获得)在后台上下文中的一些对象(让我们说数组“最后我保存了上下文。

我正在听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]; 
        }); 
    }]; 
    

    }

我失去了什么东西?我应该在保存后台上下文后保存主要的托管对象上下文吗?

如果您的上下文使用持久性存储协调器进行配置,则保存应将数据写入存储。如果您的上下文使用另一个上下文作为父级配置,则保存会将数据推送给父级。只有当最后一个父配置文件被配置为持久性存储协调器时,才会写入商店。

  1. 检查您的后台上下文是否配置了持久存储协调器。
  2. 检查返回值和-save:的可能错误。
  3. 确保您通过-performBlock...:方法处理您的背景环境。

UPDATE

每次你打电话给你-newManagedObjectContext方法时,都会创建一个新的上下文。这个上下文对你正在更新的FootBallCoach对象一无所知。您需要保存FootBallCoach对象所属的上下文。

不要忘了,每个对象都属于一个且只有一个方面。

另外,还要确保你持有的强引用其对象你使用的上下文。

+0

我编辑我的问题,并增加了一些示例代码。正如你所看到的,没有父子上下文模式,保存错误为零。 – rokridi

+0

您每次都在创建新的上下文。更新了答案。 – eofster

+0

FootBallCoach对象在主要上下文中获取。那么你是说我应该保存主要的上下文吗? – rokridi