iOS:从 JSON 更新核心数据数据库
Posted
技术标签:
【中文标题】iOS:从 JSON 更新核心数据数据库【英文标题】:iOS: update a core data DB from JSON 【发布时间】:2014-02-19 12:23:18 【问题描述】:在我的应用程序中,我以这种方式存储来自 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 的一个对象)的数据和数量。 问题是,更新我的核心数据数据库的更好解决方案是什么? 我有两种可能:
1- 使用 NSFetchRequest 更新我的数据库,检查元素是否存在,并更新它;如果它不存在,我应该创建它。最后,如果 JSON 中不存在一个对象,但它在我的核心数据数据库中,我应该删除它,这是一系列复杂的控件。
2- 删除所有核心数据数据库并使用新的 JSON 文件再次填充。
在您看来,更好的选择是什么?
我告诉你,在我的应用中,我必须只读取我的db,使用时不需要删除或修改它。
【问题讨论】:
【参考方案1】:对于我的应用程序 - 我也使用 CoreData - 我决定使用选项 1,原因有几个。
首先,它只是多一点编码,但这种方法的性能要好得多。如果你打算使用 NSFetchedResultController 你绝对应该使用更新选项。否则它会监听您的更改并多次重新加载所有视图,因为您删除所有对象并重新读取它们。
最重要的是删除所有对象是 CoreData 中非常昂贵的操作,因为您必须首先获取所有对象,而不是一个一个删除它们!!!这真是个坏主意:) 对于数百个条目,如果您计划在后台进行更新而不是在更新过程中阻塞屏幕,这确实会降低应用程序的性能。
作为一种优化,我建议保留每个对象的服务器端时间戳,并仅在移动端提取上次更新时间的更改 - 增量更新。
【讨论】:
好的,谢谢,正如@Wain 所写,你更喜欢第一个选项,那么我应该问你一些库或教程链接,以应用这个,你有任何资源吗? 对于 CoreData 本身,我认为最好的是raywenderlich.com/934/…。其他问题实际上是针对您的应用程序的 - 取决于您希望如何实现更新。我建议使用父子 MOC 并在后台线程中运行它。它为 UI 和主线程提供了非常简单的更新逻辑。【参考方案2】:选项 1 通常更好,但显然成本更高,具体取决于更改和批处理管理。选项 2 总是代价高昂,但不太容易出错。选项 2 添加了与保存附加信息相关的约束(目前可能不是问题)。
理想情况下,您希望利用现有解决方案提供选项 1 的实现,该选项经过测试并提供性能/内存效率选项。 RestKit 之类的东西(它可以在映射过程中使用临时内存缓存来查找重复项)。作为附带的好处,您还可以简化您可能拥有的其他映射代码。
【讨论】:
以上是关于iOS:从 JSON 更新核心数据数据库的主要内容,如果未能解决你的问题,请参考以下文章