gpt4 book ai didi

ios - 核心数据数据未保存

转载 作者:行者123 更新时间:2023-11-29 03:20:35 24 4
gpt4 key购买 nike

我目前正在开发一个使用 Core Data 来存储数据的应用程序。该应用程序通过下载和解析一个巨大的 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...: 方法处理背景上下文。

更新

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

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

还要确保您持有对您正在使用其对象的上下文的强引用。

关于ios - 核心数据数据未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21157349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com