CoreData:从基础到关系扩展与数据迁移
立即解锁
发布时间: 2025-08-21 01:08:30 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从入门到实践
# Core Data:从基础到关系建模与数据迁移
## 1. Core Data 基础回顾
在处理与其他值相关且会随其变化而重新计算的属性时,我们可以在`MythicalPerson`类中实现一个小方法来解决问题:
```objc
+ (NSSet *)keyPathsForValuesAffectingAwesomeness {
return [NSSet setWithObjects:@"divinity", @"power", @"goodness",
nil];
}
```
这个方法名是根据访问器名称动态构建的。在这个方法中,我们返回一个属性名称集合,这些属性是`awesomeness`属性所依赖的。这样,Core Data 会在应用程序生命周期的早期自动调用此方法,确保集合中任何属性的更改都会触发控制器更新与`awesomeness`属性绑定的对象。注意方法签名中的加号,这表明`keyPathsForValuesAffectingAwesomeness`是一个类方法,而非实例方法,这是 Cocoa 键值观察系统的一部分。
构建并运行应用程序后,当拖动其他滑块时,绿色进度条会相应改变。
## 2. 扩展数据模型:添加新实体
接下来,我们要将数据模型扩展为包含多个实体,并定义它们之间的关系。同时,创建一个 GUI 来展示和编辑这些关系。在此过程中,我们还会了解 Core Data 如何处理多个不兼容的数据模型版本,以及如何将数据存储从一个模型版本迁移到另一个版本。
### 2.1 准备工作
首先,在 Finder 中复制上一个项目的最终`MythBase`项目目录,然后进入新目录,双击`MythBase.xcodeproj`在 Xcode 中打开它。
### 2.2 添加新实体
我们要向`MythBase`添加三个新实体:`MythicalBand`、`MythicalGig`和`MythicalVenue`。具体操作如下:
1. **创建`MythicalBand`实体**:
- 确保选中新的模型文件。
- 创建一个新实体并命名为`MythicalBand`。
- 为该实体添加一个名为`name`的新属性,将其类型设置为`String`,取消选中`Optional`复选框,并选中`Indexed`复选框。
2. **创建`MythicalVenue`实体**:
- 创建一个名为`MythicalVenue`的新实体。
- 为其添加一个名为`name`的`String`类型属性,同样设置为`Indexed`且非`Optional`。
3. **创建`MythicalGig`实体**:
- 创建一个名为`MythicalGig`的实体。
- 由于演出没有名称,其唯一特征是与乐队和场地的关系以及演出日期。添加一个名为`performanceDate`的属性,将其类型更改为`Date`,可将其设置为`Optional`,无需开启索引。
以下是新实体及其属性的表格总结:
| 实体名称 | 属性名称 | 属性类型 | 是否可选 | 是否索引 |
| ---- | ---- | ---- | ---- | ---- |
| MythicalBand | name | String | 否 | 是 |
| MythicalVenue | name | String | 否 | 是 |
| MythicalGig | performanceDate | Date | 是 | 否 |
### 2.3 数据模型版本管理与迁移准备
在对数据模型进行更改之前,需要处理数据迁移问题。Core Data 会在数据存储中保存数据模型结构的元数据,当应用程序运行时,它会读取数据存储。如果检测到应用程序使用的是具有不同结构的新版本数据模型,它会自动更新数据存储以匹配最新模型。
#### 2.3.1 准备多版本模型
将当前模型转换为特殊的多版本格式,以便在 Xcode 项目和`MythBase`中存储多个版本的数据模型。具体步骤如下:
1. 在 Xcode 的导航面板中,打开`Models`组并选择`MythBase.xcdatamodeld`。
2. 从菜单中选择`Editor ➤ Add Model Version`。
3. 在弹出的对话框中,默认名称为`MythBase 2`,点击`Finish`。此时,Xcode 会复制一份数据模型,我们可以在扩展新模型的同时保留旧模型。
4. 在导航面板中,`MythBase.xcdatamodeld`名称左侧会出现一个小三角。点击三角展开内容,会看到两个版本的模型文件:`MythBase.xcdatamodel`(原始数据模型,导航面板中旁边有绿色复选框,表示 Xcode 认为它是当前版本)和`MythBase 2.xcdatamodel`(我们将在此进行更改的新模型)。
5. 选择`MythBase.xcdatamodeld`文件(包含展开三角的父行,而非下面的两个数据模型)。
6. 在`File Inspector`中,找到`Versioned Core Data Model`部分,将`Current Version`设置为`MythBase 2`。此时,绿色复选框会移动到`MythBase 2.xcdatamodel`文件上。
### 2.4 添加实体关系
现在是时候添加关系,让每个对象能够关联到其他相关对象了。我们要定义以下几种一对多关系:
- 从`MythicalBand`到`MythicalPerson`。
- 从`MythicalBand`到`MythicalGig`。
- 从`MythicalVenue`到`MythicalGig`。
需要注意的是,在 Core Data 中,每个关系实际上是单向的,通常所说的“一对多”关系,在 Core Data 中需要创建两个关系:一个从第一个实体到第二个实体的多对一关系,以及一个从第二个实体到第一个实体的一对一关系,并在模型中指定它们为反向关系,这样 Core Data 才能理解我们配置的双向性质。
#### 2.4.1 从`MythicalBand`到`MythicalPerson`的关系
1. 选择`MythicalBand`,点击`Relationships`表格视图左下角的小`+`按钮,创建一个新关系。
2. 配置新关系:
- 名称设置为`members`。
- 将目标实体设置为`MythicalPerson`。
- 选中`To-Many Relationship`复选框。
- 将`Delete Rule`保留为默认值`Nullify`。这样,我们就创建了第一个单向关系,`MythicalBand`实体现在有了一个新的`members`属性。
3. 创建反向关系:
- 选择`MythicalPerson`实体,添加一个新关系。
- 名称设置为`memberOf`。
- 将目标实体设置为`MythicalBand`。
- 将反向关系设置为`members`。
#### 2.4.2 从`MythicalBand`到`MythicalGig`的关系
1. 选择`MythicalBand`,创建一个名为`gigs`的新关系,目标实体为`MythicalGig`,并选中`To-Many Relationship`复选框。
2. 由于没有乐队的演出没有意义,将`Delete Rule`设置为`Cascade`,即删除乐队时,其所有演出也会被删除。
3. 选择`MythicalGig`,创建一个名为`band`的新关系,目标实体为`MythicalBand`,并将反向关系设置为`gigs`,`Delete Rule`保留默认值`Nullify`,即删除演出时,乐队端的相关记录会被清除,但乐队本身不受影响。
#### 2.4.3 从`MythicalVenue`到`MythicalGig`的关系
1. 选择`MythicalVenue`,创建一个名为`gigs`的新关系,目标实体为`MythicalGig`,选中`To-Many Relatio
0
0
复制全文
相关推荐









