【问题标题】:Saving data for use at runtime保存数据以供运行时使用
【发布时间】:2013-04-27 16:59:48
【问题描述】:

我有一个我正在尝试构建的 iOS 应用程序,它显示了我拥有的 .xlsx(MS Excel 文件)中的用户数据。该文件有近 11,000 行,每行 20 列。我构建了一个解析器,将每一行转换为NSObject 的一个子类,每一列都是一个实例变量。我使它符合NSCoding,将每个实例添加到NSDictionary,其键是原始文件的第一行,并将其存档。我的问题是,我不想取消归档如此庞大的 NSDictionary,以访问最多 20 个或其中包含的对象,我可能在任何给定时间都需要。

问题是:我该如何以这种方式保存这块数据,我没有 11,000 个对象存在于堆中,并且仍然能够在应用程序运行时将我需要的对象加载到应用程序中?

【问题讨论】:

    标签: ios nscoding property-list nsarchiving


    【解决方案1】:

    我认为最好的选择是将数据导出到数据库。

    最简单的解决方案是SQLiteCoreData

    我会选择 CoreData,因为它可以为您节省大量的开发时间(不过,您需要花一些时间来熟悉 CoreData)。此外,它可能会解决您仅在内存中保存您使用的对象的内存问题。

    基本上,CoreData 是一个对象图,这意味着它允许您仅在需要时加载图的一部分(对于 SQLite 存储类型)。

    根据您的描述,您有一个实体(有 20 列的行),您希望使用某种查询访问该实体,而无需加载文件中的所有实体。

    CoreData 等价物是:
    1)在核心数据中定义实体(一次,在模型设计器中)
    2)创建 CoreData 堆栈(对于简单的设计,这是自动生成的)
    3)创建一个NSPredicate来选择你喜欢的实例
    4)创建一个NSFetchRequest来定义对数据的访问权限
    5) 使用NSFetchedReaultsController 在主上下文上执行请求 6)显示你的结果

    您可以创建一个使用核心数据的新项目并查看其工作原理的示例

    【讨论】:

    • 谢谢,我一直在阅读 Big Nerd Ranch Guide to iOS 编程,但我在半路停下来自己闲逛了一下。我打开书看看 CoreData 在哪一页,翻到它,发现我把书签留在了他们开始介绍 CoreData 的那一页上,我有一点阅读要做,但我已经有一个项目来学习概念准备好了。再次感谢。