iOS:从JSON更新核心数据库

在我的应用程序中,我以这种方式存储来自JSON文件的数据(这是一个身份的例子)

NSManagedObjectContext *context = [self managedObjectContext]; for (id element in array){ NSLog(@"element:%@", element); Str *str = [NSEntityDescription insertNewObjectForEntityForName:@"Str" inManagedObjectContext:context]; Id_loc *loc = [NSEntityDescription insertNewObjectForEntityForName:@"Id_loc" inManagedObjectContext:context]; loc.id_loc = @"id_1"; [str addLocObject:loc]; } 

问题是,我从networking服务每天parsing这个JSON; 所以每天都可以改变其“Str”身份(我的JSON的一个对象)的数据和数量。 问题是,有什么更好的解决scheme来更新我的核心数据库? 我有两种可能性:

1-更新我的DB与NSFetchRequest,检查是否存在一个元素,并更新它; 如果它不存在,我应该创build它。 最后,如果一个对象不在JSON中,但它在我的核心数据库中,我应该删除它,这是一个复杂的一系列控件。

2-删除所有的核心数据分贝,并用新的JSON文件再次填充。

在你看来,有什么更好的select?

我说你在我的应用程序中,我只能读取我的分贝,我不需要删除或修改它,当我使用它。

对于我的应用程序 – 我也使用CoreData – 我决定去select1,有几个原因。

首先,这只是一个更多的编码,但是这种方法的性能要好得多。 如果你打算使用NSFetchedResultController,你一定要去更新选项。 否则,它会听你的改变,它会重新加载所有的视图很多次,因为你删除所有的对象,并读取它们。

最重要的是删除所有的对象在CoreData中是非常昂贵的操作,因为你必须首先获取所有的对象,而不是一一删除它们! 这真的是个好主意:)如果您打算在后台执行更新而不是在更新过程中屏蔽屏幕,那么对于数百个条目,它确实会降低应用程序的性能。

作为一个优化,我会build议保留在每个对象的服务器端时间戳,并只拉动移动端的最后更新时间的更改 – 增量更新。

选项1通常更好,但显然可能会更加昂贵,这取决于变更和批次pipe理。 选项2总是代价高昂,但不易出错。 选项2增加了与保存附加信息相关的约束(目前可能不是关注的问题)。

理想情况下,您希望利用现有解决scheme提供经过testing的选项1的实现,并提供性能/内存效率选项。 像RestKit (可以在映射过程中使用临时内存中caching来查找重复项)。 作为一个好处,你也可以简化你可能拥有的其他映射代码。