在iPhone上存储大型可变阵列

时间:2011-02-16 18:37:58

标签: iphone cocoa-touch core-data file nsmutablearray

好吧,我似乎无法在iPhone上找到这个存储问题的明确答案。我的模型类有几个ivars和两个非常大(MB)可变数据数组,这些数据从外部设备收集然后进行分析。我在想的是你在对象中有数据(类似于笔记或音乐文件),你可以将它保存到永久数据“文件”,然后打开旧数据“文件”并查看它(不将完成旧数据的编辑。除此之外,我想要另一个存储对象,它跟踪每个数据文件中的一些关键信息,并且还有对它们的引用(也许用户可以单击一个数据点,它将打开相应的数据文件 - 如果它仍然存在(可以被用户删除以节省空间))。

我看到大量的建议建议iPhone应用程序的所有数据存储都应该使用Core Data。问题是,除了单侧“文件”之外,对象之间没有关系。这些对象可以被认为是音符或音乐文件,它们并不关心彼此的存在,并且一次只存在一个对象(“加载”)(在内存中添加数据) ,以及稍后保存,或从正在查看的存储中加载。

管理此问题的最佳方法是什么?目前,设备控制器(处理设备通信)创建模型,并向其发送数据(模型解析并分析数据)。但是,是否应该有一些控制器来处理创建对象的文件(或Core Data managedobject,无论如何),并保存其数据,释放内存然后加载一个存储数据的新内存?

任何建议都会有所帮助,因为我发现的最好的存储示例似乎是非常关系的(员工,老板,公司) - 我可以看到它会从数据库中受益。但与此同时,手动保存目录中的文件列表可能比其他方法更有效。

3 个答案:

答案 0 :(得分:1)

我无法在Apple的文档中找到引文,但我已阅读(Apple工程师告知)“大型”数据对象有时最好存储在Core Data之外。建议的模型将BLOB(二进制大对象)放在文件系统中,其中Core Data对象引用这些大对象(即存储相对或绝对文件路径)。

因此,假设您的BLOB是音乐数据,那么您可能会让您的核心数据模型拥有一个保存元数据的实体(例如,大小,时间/持续时间等)以及对保存实际的文件的引用数据。您的元数据实体也可以与系统中的其他实体建立关系。例如,您可以存储音乐数据的频谱图,并将其保存在单独的实体中。

我正在针对从各种测量传感器采样的数据解决这个问题。最后,我认为我的数据集足够小(在大多数情况下)与Core Data一起存储为专用实体的NSData属性。包装实体是“专用的”,以避免加载数据只是为了向用户显示元数据。

<强>更新

我在“大数据对象(BLOB)”部分末尾的“核心数据编程指南”中找到了关于BLOB的一行:

  

但是,如果你能够,那就更好了   将BLOB存储为资源   文件系统,并维护链接   (例如URL或路径)   资源。然后,您可以加载BLOB作为   并在必要时。

答案 1 :(得分:0)

我还建议使用Core Data。虽然Core Data确实可以轻松处理关系,但没有人阻止您使用Core Data存储不相关的信息。没有规则反对在核心数据中创建彼此之间没有任何关系的模型;只是不要将它们连接在一起。

Core Data将处理对数据库的所有读/写操作,这将为您省去解析自己的文件的麻烦。在第一次尝试使用Core Data时有一点学习曲线,但是一旦你运行它,你就会感激它就在那里。

答案 2 :(得分:0)

除非您需要任何类型的数据库访问(快速查询,频繁更新等),否则数据库在编码和性能方面都会产生过多的开销。数据库功能并不是完全免费的,所以我可以想到很多场景,如果你选择以下任何一种方法,你可以用更少的努力获得更好的结果:

  • 具有单独存储的索引文件的多个文件;
  • 您自己的二进制格式的大文件。

选择取决于项目数量,项目大小,大小是否相同,修改数据和/或索引的频率等等。