iOS应用基础数据持久化指南
立即解锁
发布时间: 2025-08-24 01:08:13 阅读量: 2 订阅数: 7 

### iOS应用基础数据持久化指南
#### 1. 应用沙盒
在iOS应用开发中,应用的沙盒机制是数据持久化的重要基础。每个应用都有自己独立的`/Documents`文件夹,应用只能对自己的`/Documents`目录进行读写操作。
要查看应用在iOS中的组织方式,可以通过iPhone模拟器的文件夹布局来了解。在Mac OS X系统中,具体操作步骤如下:
1. 打开Finder窗口,导航到主目录。
2. 如果能看到`Library`文件夹,直接进入;若看不到,选择“前往” -> “前往文件夹…”,输入`Library`并回车。
3. 在`Library`文件夹中,进入`Application Support/iPhone Simulator/`。
4. 这里会有当前Xcode安装支持的每个iOS版本的子目录,选择代表最新iOS版本的目录。
5. 此时会看到四个子文件夹,其中一个名为`Applications`。
虽然这是模拟器的布局,但实际设备上的文件结构与之类似。`Applications`文件夹用于存储iOS应用,打开该文件夹会看到许多由长字符串组成的文件夹和文件,这些名称是全局唯一标识符(GUID),由Xcode自动生成,每个文件夹包含一个应用及其支持文件夹。
打开一个应用子目录,会看到以下熟悉的内容:
- **Documents**:应用的数据存储在此,基于`NSUserDefaults`的偏好设置除外。
- **Library**:基于`NSUserDefaults`的偏好设置存储在`Library/Preferences`文件夹中。
- **tmp**:该目录用于存储临时文件。当iOS设备同步时,写入`tmp`的文件不会被iTunes备份,应用需要在文件不再需要时负责删除,以避免填满文件系统。
#### 2. 获取目录路径
##### 2.1 获取Documents目录
由于应用所在文件夹的名称看似随机,要获取`Documents`目录的完整路径以便读写文件,可以使用`NSSearchPathForDirectoriesInDomain()`函数。示例代码如下:
```objc
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
```
其中,`NSDocumentDirectory`表示要查找`Documents`目录的路径,`NSUserDomainMask`表示将搜索限制在应用的沙盒内。虽然返回的是匹配路径的数组,但由于每个应用只有一个`Documents`目录,所以该目录位于数组的索引0处。
要创建一个文件名,可以使用`stringByAppendingPathComponent:`方法:
```objc
NSString *filename = [documentsDirectory
stringByAppendingPathComponent:@"theFile.txt"];
```
这样,`filename`就包含了应用`Documents`目录中名为`theFile.txt`的文件的完整路径。
##### 2.2 获取tmp目录
获取应用的临时目录更简单,使用`NSTemporaryDirectory()`函数即可返回临时目录的完整路径。示例代码如下:
```objc
NSString *tempPath = NSTemporaryDirectory();
NSString *tempFile = [tempPath
stringByAppendingPathComponent:@"tempFile.txt"];
```
#### 3. 文件保存策略
本章介绍的四种数据持久化方法都利用了iOS文件系统。不同方法在文件保存策略上有所不同:
| 方法 | 保存策略 |
| ---- | ---- |
| SQLite3 | 创建一个SQLite3数据库文件,由SQLite3负责数据的存储和检索。 |
| Core Data | 以最简单的形式,为你处理所有文件系统管理。 |
| 属性列表和归档 | 需要考虑将数据存储在单个文件还是多个文件中。 |
##### 3.1 单文件持久化
使用单个文件存储数据是最简单的方法,对于许多应用来说是完全可以接受的。具体步骤如下:
1. 创建一个根对象,通常是`NSArray`或`NSDictionary`(使用归档时,根对象也可以基于自定义类)。
2. 用需要持久化的所有程序数据填充根对象。
3. 需要保存时,代码将根对象的全部内容重写到单个文件。
4. 应用启动时,将文件的全部内容读入内存;退出时,将全部内容写出。
单文件持久化的缺点是,即使是最小的更改,也需要将应用的所有数据加载到内存并写入文件系统。但如果应用管理的数据不超过几兆字节,这种方法可能是合适的,其简单性会让开发更轻松。
##### 3.2 多文件持久化
使用多个文件进行持久化是另一种选择。例如,电子邮件应用可能将每封邮件存储在自己的文件中。
这种方法的优点如下:
- 允许应用仅加载用户请求的数据(另一种形式的懒加载)。
- 用户进行更改时,只需保存更改的文件。
- 收到低内存通知时,可以释放用户当前未查看的数据所占用的内存,下次需要时再从文件系统重新加载。
然而,多文件持久化会给应用增加相当大的复杂性。目前,我们将坚持使用单文件持久化。
#### 4. 使用属性列表
属性列表在许多示例应用中都有使用,例如用于指定应用偏好设置。属性列表很方便,可以使用Xcode或属性列表编辑器应用手动编辑。只要字典或数组只包含特定的可序列化对象,`NSDictionary`和`NSArray`实例就可以写入属性列表并从中创建。
##### 4.1 属性列表序列化
可序列化对象是已转换为字节流的对象,以便存储在文件或通过网络传输。只有某些对象可以放入集合类(如`NSDictionary`或`NSArray`),并使用集合类的`writeToFile:atomically:`方法存储到属性列表中。以下Objective - C类可以这样序列化:
- `NSArray`
- `NSMutableArray`
- `NSDictionary`
- `NSMutableDictionary`
- `NSData`
- `NSMutableData`
- `NSString`
- `NSMutableString`
- `NSNumber`
- `NSDate`
如果可以仅使用这些对象构建数据模型,就可以使用属性列表来保存和加载数据。示例代码如下:
```objc
[myArray writeToFile:@"/some/file/location/output.plist" atomically:YES];
```
`atomically`参数指示方法将数据写入辅助文件,而不是指定的位置。成功写入文件后,会将辅助文件复制到第一个参数指定的位置。这是一种更安全的写入文件的方式,因为如果应用在保存过程中崩溃,现有文件(如果有的话)不会被损坏,虽然会增加一些开销,但在大多数情况下是值得的。
属性列表方法的问题在于,自定义对象不能序列化为属性列表,也不能直接使用Cocoa Touch中未在上述可序列化对象列表中指定的其他类,如`NSURL`、`UIImage`和`UIColor`。
除了序列化问题,将所有模型数据以属性列表的形式保存意味着难以创建派生或计算属性,并且一些本应包含在模型类中的代码必须移到控制器类中。不过,对于简单的数据模型和应用,这些限制是可以接受的。在复杂应用中,简单的属性列表仍然很有用,例如在应用有选择器时,创建一个plist文件并将其放在项目的`Resource
0
0
复制全文
相关推荐









