如何从JSON文件创建Core Data托管对象并让它们在应用程序启动之间保持不变?

时间:2014-01-19 02:32:02

标签: ios core-data

我有一堆NSManagedObjects是从在线JSON文件创建的。目前,我每次启动应用程序时都会创建它们(不理想)。

在我尝试创建对象之前,检查对象是否已经存在的最佳方法是什么?

如果我[self saveContext]它似乎有效,但由于我不知道如何检查它们是否已经加载,它最终会复制所有内容。

显然,我对核心数据相对较新,似乎错过了一个关键概念。

[编辑]在阅读了越来越多关于何时何地将这么多对象加载到Core Data之后,看起来预装数据对我来说是最好的选择(数据是静态的,可能只会更新一个每年几次)。

我选择不使用“查找或创建模式”,因为我认为考虑到需要检查/创建的对象数量会更加昂贵,并希望下次保存有关后台队列的学习;)< / p>

然后我无法让sqlite文件工作,并且在创建每个对象之后保存上下文而不是在加载所有对象之后保存上下文来解决它。

3 个答案:

答案 0 :(得分:1)

通常根据我的经验来处理这种方式是通过以下两种选择之一:

  1. 首先检查项目是否存在,如果存在,则更新它,否则插入它。以下是我过去用于凭证模型的示例:

    Voucher *newObject = nil;
    
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Voucher"];
    request.predicate = [NSPredicate predicateWithFormat:@"voucher_id = %@",[dictionary objectForKey:@"voucher_id"]];
    NSError *error = nil;
    NSArray *matches = [context executeFetchRequest:request error:&error];
    
    if ([matches count] == 0 ){
        newObject = [NSEntityDescription insertNewObjectForEntityForName:@"Voucher" inManagedObjectContext:context];
        newObject.number = [json_dictionary objectForKey:@"number"];
        newObject.valid_from = [json_dictionary objectForKey:@"valid_from"];
        newObject.valid_to = [json_dictionary objectForKey:@"valid_to"];
    }
    else {
        newObject = [matches lastObject];
        newObject.number = [json_dictionary objectForKey:@"number"];
        newObject.valid_from = [json_dictionary objectForKey:@"valid_from"];
        newObject.valid_to = [json_dictionary objectForKey:@"valid_to"];
        newObject.voucher_id = [json_dictionary objectForKey:@"voucher_id"];
    }
    return newObject;
    
  2. 另一种方法是选择all,放入NSOrderedSet,然后运行比较,只有在插入时才插入。

  3. 如果您查看此页面上的“核心数据性能优化和调试”https://developer.apple.com/wwdc/videos/,则可以对此进行详细解释

答案 1 :(得分:0)

Ray Wenderlich有一个关于核心数据的详细教程,向您展示如何逐步完成:(确保打开谷歌翻译)

在回答你的评论问题时,这里是:

  1. 创建一个新文件并选择创建数据模型(在核心数据下)

  2. 添加您的实体 - 实体是您声明为类数据模型的实体。请注意,我有Location,Marker和Village,因为我已经创建了这些类(Location.m / .h等)]

  3. 添加与这些实体关联的属性(属性)。

  4. http://i.stack.imgur.com/wOUvF.png http://i.stack.imgur.com/5AJGZ.png

    如果有帮助,请告诉我!

答案 2 :(得分:0)

如果您以前没有使用它,学习曲线可能会有点陡峭。但一个好方法是使用RestKit。

https://github.com/RestKit/RestKit/wiki/Object-mapping#core-data