【问题标题】:iOS: update a core data DB from JSONiOS:从 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,使用时不需要删除或修改它。

【问题讨论】:

    标签: ios database core-data nsmanagedobject


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的,谢谢,正如@Wain 所写,你更喜欢第一个选项,那么我应该问你一些库或教程链接,以应用这个,你有任何资源吗?
    • 对于 CoreData 本身,我认为最好的是raywenderlich.com/934/…。其他问题实际上是针对您的应用程序的 - 取决于您希望如何实现更新。我建议使用父子 MOC 并在后台线程中运行它。它为 UI 和主线程提供了非常简单的更新逻辑。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多