如何将从Web下载的表加载到iOS中的核心数据中?

时间:2013-11-02 17:51:58

标签: ios sqlite core-data

如何加载从网上下载的表并将其放入核心数据? 如果我有一个大约2000行的CSV文件(可能是SQLite),已经更新,并像亚马逊网络服务一样放到网上,那么在用户使用应用程序时如何将其加载到核心数据中呢?我想完全替换以前的文件,然后重新加载表。我想我将它保存到文档目录,但是如何将其加载到核心数据中并快速加载,以便用户不必等待太长时间?

我不知道用户需要什么数据,自上次使用以来添加或删除的内容,因此我无法仅查询更改。该表由文本,整数和地理编码组成,我将每月更新两次。

核心数据是否可以从外部文件中读取以填充tableView,还是只能从内部读取内容?我并不一定需要表之间的关系,所以如果它阻碍了我,我可以删除它。可能有也可能没有加载第二个表。使用SQLite表会更好吗?我之前没有完成这部分核心数据。什么是最佳做法?代码示例会有所帮助。

1 个答案:

答案 0 :(得分:2)

我认为您精通使用Core Data,并且您正在部署到iOS 5及更高版本。我还假设您非常了解CSV格式。那么这将是一个设计开始:

  1. 创建解析器对象。这个对象负责理解csv文件(这是你需要自己编写的逻辑,没有本机csv-parser clas)。您为此对象提供NSString或文件的本地URL,并逐行读取。假设每行包含一个Core Data实体的数据:此解析器然后从字符串的第一行提取值并创建/更新现有的Core Data实体。有关更新/创建核心数据实体的有效方法,请参阅this link。 确保所有这些解析都是在backgroundThread上完成的,并且NSManagedObjectContext具有专用队列类型。
  2. 创建一个UITableViewController,它利用NSFetchedResultsController,使用NSManagedObjectContext进行初始化,NSManagedObjectContext是解析器对象中使用的NSManagedObejctContext的父级。确保在初始化时为其提供主队列concurrencytype。这样,每次解析器创建/更新实体时,它都会将其保存到父上下文中。该上下文反过来通知NSFetchedResutsController,您可以通过NSFetchedResultsController委托方法分别更新每个更新/创建的实体的UI,尽可能快地向用户显示更改。
  3. 确保一些监督对象(可能是数据管理器,或者可能是网络类,或者可能是viewController的事件,尽管我会选择数据管理器)被告知完整的解析过程已经结束,因此可以保存UITableViewController中的managedObject(实际上会保存数据)。