最近一周比较懒,花了大量时间在游戏上,自从多年前通关塞尔达之后,Switch 基本就是吃灰状态,最近突然想玩游戏了,于是偷了一下懒。

当然,游戏再好玩也会腻,我还是有在认真开发新功能的。最近的任务就是给 瓦尔登 做一个数据的备份和恢复功能。

我原本以为这个会比较简单,因为以我后端出身的背景,无非就是数据库文件的操作。但我低估了 CoreData 数据迁移、恢复的复杂性,事实上,我这周大部分时间都花在问题排查上,每天都在 “啊,我哪里错了?”、“终于解决了!” 之间反复,翻阅了不少书籍和网上的帖子,ChatGPT 也用上了 。

也许是因为融合了生态,在 CoreData 做 CRUD 以外的操作会变得非常困难。

比如,导出数据,我原以为只需要导出 SQLite 文件就行,但实际上你不能直接这么干,因为你不能影响到当前的 viewContext,因此还需要新建一个临时的 persistentStoreCoordinator 去操作。

而备份数据还算是比较简单的,通过备份文件去恢复数据就难倒我了。

理想情况是这样的:

  1. 用户选择备份的文件
  2. 清除本地数据、iCloud上已经同步的数据
  3. 数据恢复

但实际上遇到的问题是,当从备份文件中恢复数据以后,原有的数据在重启应用以后有回来了,导致数据重复,也就是说本地的旧数据确实没有了,但 iCloud 上还有数据,到现在我也没找到通过代码清除 iCloud 数据的方法。

最后一个妥协的方式就是手动在 iCloud 储存空间管理内清除数据以后再进行恢复。

嗯,先把这个问题放一放,接受不完美吧。虽然没有实现一个完美的解决方式,但是在解决问题的过程中,还是学习到了不少的东西。以前用 CoreData,从来不会去想为什么要这样用,都是直接拿来就用了,为什么会有 viewContext?为什么会有 coordinator?为什么会有 container?它们的职责是什么?以前从来没想过,但经过这次以后,对 CoreData 认识感觉上了一个台阶。

如果一直卡在一个问题上,也许可以尝试去散散步,说不定散个步回来问题就解决了。

不妨试试 👉🏻 瓦尔登

Categorized in:

Tagged in: