1

例如,阅读这篇文章,将 NSDictionary 写入 plist 看起来很容易。现在,如果我只想修改现有 plist 的一行:有没有办法在不重写整个文件的情况下更新该行?

就像“更新数据库表中的一行时,我不必重写整个表”?

谢谢,J。

4

4 回答 4

3

第一:plist是针对非常琐碎的数据,所以应该不存在读写优化的问题。好像您需要优化它,这意味着您需要更改应用程序设计。

第二:plist基本上是一个xml文件,所以你当然可以使用xml解析器。

于 2012-07-10T11:32:41.160 回答
1

从理论上讲,在新值的字符串表示的长度占用与旧值一样多的字符的情况下,您可以更快地进行修改。但是,这将是微优化的一个坏情况:与重写整个表可能需要相当长的时间的数据库不同,就时间而言,重写整个 plist 应该被忽视。从任何标准来看,您在文件中定位和覆盖旧值的代码都不是很漂亮。它没有机会匹配重写整个事物的三行“读取-修改-写入”代码片段的清晰度。

这假设您将属性列表用于其预期目的,即存储相对少量的数据。如果您使用 plist 来存储中量到大量数据,则可能需要切换到使用数据库,其中允许更新单个行。

于 2012-07-10T11:40:49.703 回答
1

这其中的意义在哪里?

尽管已经说过,使用 XML 的 plist 是为少量数据而设计的,并且只有当新值不对您的值的长度(XML 中的字符串表示)进行任何更改时,它才能正常工作, 几乎没有任何讨价还价的余地。

坦率地说,我不知道集群(或者在 iOS 文件系统中命名的可分配磁盘空间的最小部分)的大小是多少,但我不希望它比典型 plist 文件的平均大小小得多。在我所知道的所有文件系统中,一个集群总是会一次性写入。即使程序员只是更改了一个字节并尝试仅将那个字节写回文件,操作系统也会始终将整个集群写入磁盘(或者我们仍然称之为磁盘的任何东西:)。

意思是——即使你努力,你也很难从那次尝试中得到任何东西。当然,除非您的数据结构相当大并且对于 plist 文件来说可能很复杂。在这种情况下,正如已经说过的那样,请考虑更改您正在使用的数据存储方法。

于 2012-07-10T12:04:31.943 回答
0

另一个答案


你有:

  1. 一个 plist 文件
  2. NSMutableArray加载此 plist的容器(例如)
  3. 一个表格视图,它从这个容器中获取值。

通过表格视图修改 plist:

  1. 更改容器中的值
  2. 将容器写回 plist 文件。
于 2012-07-10T11:32:31.957 回答