ios - 保存数据以供运行时使用

标签 ios nscoding property-list nsarchiving

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

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

最佳答案

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

最简单的解决方案是 SQLiteCoreData .

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

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

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

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

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

关于ios - 保存数据以供运行时使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254717/

相关文章:

ios - Swift - 使用 plist 的 tableview 在添加新数据后不会重新加载

ios - Swift 3 - 只有一个项目的队列

swift - 在 Swift 中保存结构

ios - 无法从 plist 读取 CLLocationDegrees

Cocoa:不构建字典的属性列表的元素计数?

ios - 如何将 NSCoding 协议(protocol)与枚举一起使用?

ios - ARC 中的引用计数

ios - 为什么 INSPECT ELEMENT 或 WEB INSPECTOR 或 developerExtrasEnabled (WkWebView) 在 iOS 中不起作用而在 OSX 中起作用

ios - ViewController 不访问您的元素

ios - NSKeyedArchiver 不会保存或加载对象