Core Data详细解析(八) —— Core Data的轻量级迁移(二)

版本记录

版本号 时间
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可以自动查看两个数据模型中的差异,并在它们之间创建映射模型。

对于模型版本之间相同的entitiesattributes,这是通过映射的简单数据传递。 对于其他更改,只需遵循一些简单的Core Data规则即可创建映射模型。

在新模型中,更改必须符合明显的迁移模式,例如:

  • 删除entities, attributesrelationships
  • 使用renamingIdentifier重命entities, attributesrelationships
  • 添加新的可选属性
  • 使用默认值添加新的必需属性
  • 将可选属性更改为非可选属性并指定默认值
  • 将非可选属性更改为可选
  • 更改实体层次结构
  • 添加新的父实体并在层次结构中向上或向下移动属性
  • 将关系从一对多改为多对多
  • 将关系从非有序对多转换为有序对多(反之亦然)

注意:有关Core Data如何推断轻量级迁移映射的更多信息,请查看Apple的文档:https://developer.apple.com/documentation/coredata/using_lightweight_migration

从此列表中可以看出,Core Data可以检测,更重要的是,可以自动响应数据模型之间的各种常见变化。 根据经验,如有必要,所有迁移都应从轻量级迁移开始,并在需要时转移到更复杂的映射。

至于从UnCloudNotesUnCloudNotes 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的轻量级迁移,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容