我是 Mac 上的 Objective-C 编程新手。我有一个 Mac 应用程序,我创建了一个“产品”类,其中包含“ID”、“名称”、“价格”等变量。在我的应用程序中创建新的“产品”时,我需要能够保存它。我已经查看了各种保存方法,但我不确定使用哪种方法。任何建议将不胜感激。
4 回答
我会使用核心数据。我将从基本的 Xcode 主细节模板开始,它将为您创建模型和示例实体,以及用于列出所有项目并添加新项目的视图和一个细节视图,您可以在其中看到令人震惊的细节.
要在文件中保存/读取您的对象,您必须执行一些称为序列化和反序列化您的对象的操作。为此,您必须决定是要使用现有文件格式(推荐)还是创建自己的文件格式。
使用现有格式 - 一个好的做法是使用现有格式(如XML),这样可以更轻松地稍后从不同的应用程序读取数据。XML 的内容可能如下所示:
<products>
<product>
<id>24</id>
<name>Playstation 3</name>
<price>200</price>
</product>
<product>
<id>52</id>
<name>Xbox 360</name>
<price>150</price>
</product>
<product>
<id>64</id>
<name>Pooh, the bear</name>
<price>10</price>
</product>
</products>
以后任何其他应用程序都可以轻松读取此结构。要在这样的结构中获取对象的内容,您可以使用像 wonderxml 这样的序列化库,或者编写自己的序列化方法来序列化和反序列化您的对象。最后,您将使用这些方法中的任何一种创建的 XML 写入文件,例如使用 NSFileManager。
创建自己的文本或二进制格式需要定义自己的文件格式,因此需要编写自己的序列化和反序列化方法。
文本格式以文本方式写入文件,就像您定义它的方式一样。例如,用“,”分隔每个属性,用“;”分隔每个产品条目。在这里,您必须注意编码和转义用作分隔符的字符。内容可能如下所示(注意反斜杠作为转义字符):
24,Playstation 3,200;52,Xbox 360,150;64,Pooh\, the bear,10
创建自己的二进制格式需要更多关于二进制文件的知识。您必须定义内容的顺序并注意编码。例如,您的格式可能如下所示:
-------------------------------------------------------|
| attribute | length | notice |
|------------|---------|-------------------------------|
| id | 4 bytes | number, note [endianess][5] |
| nameLength | 4 bytes | length of the following name |
| name | ? bytes | take length from previous |
| price | 4 bytes | |
-------------------------------------------------------|
反序列化时,您只需根据您创建的规范读取/写入对象。此方法创建最紧凑的文件。
用 Product 制作 NSDictionary 容易吗?
该字典中的所有值都是 NSString、NSData、NSArray 或 NSDictionary 的子类吗?
如果是这样,您可以创建一个 NSArray,而不是为您的每个产品包含一个这样的 NSDictionary。
writeToFile:atomically:方法将允许您从该 NSArray 保存文件。该方法initWithContentsOfFile:
将允许您读取该文件并从中创建一个 NSArray。然后,您将能够取出每个 NSDictionary 并从中重新创建一个产品。
如果您不能使您的数据适合该方案,您将不得不使用更复杂的序列化方法。