定义多对多关系
- 在数据模型编辑器中:
- 打开Xcode中的数据模型文件(
.xcdatamodeld
)。
- 分别创建“书籍”(例如命名为
Book
)和“作者”(例如命名为Author
)两个实体。
- 在
Book
实体中,添加一个关系(Relationship),例如命名为authors
,设置其类型为Author
,并将Destination
指向Author
实体。由于一本书可以有多个作者,将To - Many
属性勾选。
- 在
Author
实体中,同样添加一个关系,例如命名为books
,类型为Book
,Destination
指向Book
实体,因为一个作者可以写多本书,所以也勾选To - Many
属性。
- 为了确保数据的一致性,将
books
关系的Inverse
设置为authors
,反之亦然。这样就建立了Book
和Author
之间的多对多关系。
数据迁移(给‘书籍’实体新增‘出版日期’属性)
- 自动迁移:
- 打开项目的
Core Data
栈设置。在NSPersistentStoreCoordinator
的初始化代码中,设置NSMigratePersistentStoresAutomaticallyOption
和NSInferMappingModelAutomaticallyOption
选项为YES
。例如:
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @(YES),
NSInferMappingModelAutomaticallyOption : @(YES)
};
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
NSError *error = nil;
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
// 处理错误
}
- 这种方式适用于简单的数据模型变化,Core Data会尝试自动推断映射模型并迁移数据。
- 手动迁移(复杂场景):
- 创建映射模型:
- 选择数据模型文件,点击菜单栏
Editor
-> Create Mapping Model
。
- 在弹出的对话框中,选择源数据模型(旧版本)和目标数据模型(新版本)。
- 配置映射模型:
- 打开新创建的映射模型文件,在左侧导航栏中,源实体和目标实体都已列出。
- 对于“书籍”实体,将已有的属性从源实体映射到目标实体。对于新增的“出版日期”属性,如果没有默认值需求,可以直接忽略其映射(因为新属性在旧数据中不存在)。如果需要设置默认值,可以在映射模型中通过
Expression
等方式设置。
- 执行迁移:
- 当应用启动并需要进行迁移时,获取
NSPersistentStoreCoordinator
,然后使用migratePersistentStore:toURL:options:withType:error:
方法进行迁移。例如:
NSPersistentStore *store = // 获取已存在的持久化存储
NSURL *newStoreURL = // 新的存储URL
NSDictionary *options = // 迁移选项
NSError *error = nil;
NSPersistentStore *newStore = [coordinator migratePersistentStore:store toURL:newStoreURL options:options withType:NSSQLiteStoreType error:&error];
if (!newStore) {
// 处理错误
}