版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.09.27 星期四 |
前言
数据是移动端的重点关注对象,其中有一条就是数据存储。CoreData是苹果出的数据存储和持久化技术,面向对象进行数据相关存储。感兴趣的可以看下面几篇文章。
1. iOS CoreData(一)
2. iOS CoreData实现数据存储(二)
3. Core Data详细解析(三) —— 一个简单的入门示例(一)
4. Core Data详细解析(四) —— 一个简单的入门示例(二)
5. Core Data详细解析(五) —— 基于多上下文的Core Data简单解析示例(一)
6. Core Data详细解析(六) —— 基于多上下文的Core Data简单解析示例(二)
7. Core Data详细解析(七) —— Core Data的轻量级迁移(一)
Inferred mapping models - 推断的映射模型
当您在NSPersistentStoreDescription
上启用shouldInferMappingModelAutomatically
标志时,Core Data可以在许多情况下推断出映射模型。 Core Data可以自动查看两个数据模型中的差异,并在它们之间创建映射模型。
对于模型版本之间相同的entities
和 attributes
,这是通过映射的简单数据传递。 对于其他更改,只需遵循一些简单的Core Data规则即可创建映射模型。
在新模型中,更改必须符合明显的迁移模式,例如:
- 删除
entities
,attributes
和relationships
- 使用
renamingIdentifier
重命entities
,attributes
和relationships
- 添加新的可选属性
- 使用默认值添加新的必需属性
- 将可选属性更改为非可选属性并指定默认值
- 将非可选属性更改为可选
- 更改实体层次结构
- 添加新的父实体并在层次结构中向上或向下移动属性
- 将关系从一对多改为多对多
- 将关系从非有序对多转换为有序对多(反之亦然)
注意:有关Core Data如何推断轻量级迁移映射的更多信息,请查看Apple的文档:https://developer.apple.com/documentation/coredata/using_lightweight_migration。
从此列表中可以看出,Core Data可以检测,更重要的是,可以自动响应数据模型之间的各种常见变化。 根据经验,如有必要,所有迁移都应从轻量级迁移开始,并在需要时转移到更复杂的映射。
至于从UnCloudNotes
到UnCloudNotes v2
的迁移,image属性的默认值为nil
,因为它是一个可选属性。 这意味着Core Data可以轻松地将旧数据存储迁移到新数据存储,因为此更改遵循轻量级迁移模式列表中的第3项。
1. Image attachments - 图像附件
现在数据已经被迁移,您需要更新UI以允许图像附件到新笔记。 幸运的是,大部分工作都是为你完成的。
打开Main.storyboard
并找到Create Note
场景。 在下面,您将看到Create Note With Images
场景,其中包括用于附加图像的界面。
Create Note
场景附加到具有根视图控制器关系的导航控制器。 按住Control
键从导航控制器拖动到Create Note With Images
场景,然后选择根视图控制器关系segue
。
这将断开旧的Create Note
场景并连接新的,由图像驱动的场景:
接下来,打开AttachPhotoViewController.swift
并将以下方法添加到UIImagePickerControllerDelegate
扩展:
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info:
[UIImagePickerController.InfoKey: Any]) {
guard let note = note else { return }
note.image =
info[UIImagePickerController.InfoKey.originalImage] as? UIImage
_ = navigationController?.popViewController(animated: true)
}
一旦用户从标准图像选择器中选择图像,这将填充笔记的新图像属性。
接下来,打开CreateNoteViewController.swift
并使用以下内容替换viewDidAppear(_ :)
:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
guard let image = note?.image else {
titleField.becomeFirstResponder()
return
}
attachedPhoto.image = image
view.endEditing(true)
}
如果用户在笔记中添加了一个图像,则会显示新图像。
接下来,打开NotesListViewController.swift
并根据以下内容更新tableView(_:cellForRowAt):
:
override func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath)
-> UITableViewCell {
let note = notes.object(at: indexPath)
let cell: NoteTableViewCell
if note.image == nil {
cell = tableView.dequeueReusableCell(
withIdentifier: "NoteCell",
for: indexPath) as! NoteTableViewCell
} else {
cell = tableView.dequeueReusableCell(
withIdentifier: "NoteCellWithImage",
for: indexPath) as! NoteImageTableViewCell
}
cell.note = note
return cell
}
这将根据具有是否存在图像将正确的UITableViewCell子类dequeue出列。 最后,打开NoteImageTableViewCell.swift
并将以下内容添加到updateNoteInfo(note:)
:
noteImage.image = note.image
这将使用note中的图像更新NoteImageTableViewCell
内的UIImageView
。 构建并运行,并选择添加新note
:
点击Attach Image
按钮可将图像添加到note
中。 从模拟器照片库中选择一张图片,您将在新note
中看到它:
该应用程序使用标准UIImagePickerController
将照片添到notes
附件。
注意:要将自己的图像添加到模拟器的相册中,请将图像文件拖到打开的模拟器窗口中。 值得庆幸的是,iOS模拟器附带了一个可供您使用的照片库。
如果您正在使用设备,请打开AttachPhotoViewController.swift
并将图像选择器控制器上的sourceType
属性设置为.camera
以使用设备相机拍摄照片。 现有代码使用相册,因为模拟器中没有相机。
后记
本篇主要讲述了Core Data的轻量级迁移,感兴趣的给个赞或者关注~~~