Ios 如何从JSON文件创建核心数据管理对象,并在应用程序启动之间保持这些对象?

Ios 如何从JSON文件创建核心数据管理对象,并在应用程序启动之间保持这些对象?,ios,core-data,Ios,Core Data,我有一堆NSManagedObject,它们是通过在线JSON文件创建的。目前,每次应用程序启动时我都会创建它们,但效果并不理想 在我尝试创建对象之前,检查对象是否已经存在的最佳方法是什么 如果我使用[self-saveContext],它似乎可以工作,但由于我不知道如何检查它们是否已经加载,它最终会复制所有内容 显然,我对核心数据比较陌生,似乎缺少一个关键概念 [编辑]在阅读了越来越多关于何时何地将这么多对象加载到核心数据中的内容后,我认为预加载数据是最好的选择。数据是静态的,每年可能只更新几

我有一堆NSManagedObject,它们是通过在线JSON文件创建的。目前,每次应用程序启动时我都会创建它们,但效果并不理想

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

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

显然,我对核心数据比较陌生,似乎缺少一个关键概念

[编辑]在阅读了越来越多关于何时何地将这么多对象加载到核心数据中的内容后,我认为预加载数据是最好的选择。数据是静态的,每年可能只更新几次

我选择不使用“查找”或“创建”模式,因为考虑到需要检查/创建的对象的数量,我认为这将更加昂贵,并且希望下次保存对后台队列的了解


当时我在使用sqlite文件时遇到了问题,解决方法是在创建每个对象后保存上下文,而不是在加载所有对象后保存一次上下文。

Ray Wenderlich有一个关于核心数据的详细教程,向您展示了如何一步一步地执行:确保打开Google Translate

以下是您在评论中提出的问题:

创建一个新文件并选择在Core Data下创建datamodel

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

添加与这些实体关联的属性


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

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

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;
另一种方法是选择all,放入一个SensorDeredSet,然后运行比较,如果不在集合中,则只插入


如果您在本页上查看核心数据性能优化和调试,就会发现这是一个很好的解释

如果您以前没有做过这方面的工作,学习曲线可能有点陡峭。但是一个好方法是使用RestKit


或者温习一下我的韩语!不幸的是,这有点难以理解:这是在OSX上,从任何数据源导入数据,创建一个简单的控制台应用程序,返回到核心数据存储数据存储,然后移动到iOS project horse。很酷吗?我找到了同一篇文章的英文版本,并说有两种方法可以做到这一点:1。从外部来源启动时填写核心数据,以及2。提供预填充的SQLite数据库。这篇文章继续到演示2,但我想知道如何做1。我更新了对您上述问题的回答。如果不清楚,你能把你的代码上传到github的某个地方吗?我可以帮忙。问题不是把对象加载到核心数据中,而是每次都尽量避免加载它们(如果它们已经存在)。如果看不到你的代码,很难看出你做错了什么。然而,我有Ray Wenderlich的书,iOS学徒54美元。本书共有4个教程,第三个教程深入介绍了核心数据。还有源代码,你可以比较你做错了什么。第三个教程本身大约有280页长,它肯定会帮助你处理核心数据。按照苹果公司的规定查找或创建模式