iOS:从JSON更新核心数据DB

时间:2014-02-19 12:23:19

标签: ios database core-data nsmanagedobject

在我的应用程序中,我以这种方式存储来自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];
}

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

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

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

在您看来,什么是更好的选择?

我说你在我的应用程序中我必须只读取我的数据库,并且在使用它时我不需要删除或修改它。

2 个答案:

答案 0 :(得分:1)

选项1通常更好,但显然可能更昂贵,具体取决于更改和批次管理。选项2总是很昂贵,但不容易出错。选项2增加了与保存附加信息相关的约束(目前可能不是问题)。

理想情况下,您希望利用现有解决方案提供选项1的实现,该选项经过测试并提供性能/内存效率选项。像RestKit之类的东西(可以使用临时内存缓存在映射过程中查找重复项)。作为附带好处,您还可以简化其他可能的映射代码。

答案 1 :(得分:1)

对于我的应用程序 - 我也使用CoreData - 我决定使用选项1,原因有几个。

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

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

作为优化,我建议保留每个对象的服务器端时间戳,并仅从移动端的上次更新时间中提取更改 - 增量更新。