[前言]
上一篇介绍完了基本的结构设计,也讲了基本的CRUD。
但是,开发设计中,资料库的结构是会变动的。
有时可能甚至于发生结构上的失策而需要改动型态之类的。
问题是,如果你单纯只是去改结构,那么在你下一次执行时,势必会发生编译错误。
因为Realm会自动去判断你的资料结构是不是符合当前的状态。
那么一但你改动了结构,是否就必须有较大的设定改变呢?
其实,这一点,Realm真的都帮我们处理好了。
[设置]
(这边的设置法则和官方的不太一样,因为我觉得这样比较好管理)
基本上,你只需要开个档案(我档名都叫RealmMigration.swift)
然后在其中写入迁移设定就好了。这份设定档的code基本上就是固定的。
所以其实照抄贴上就行了:
import Foundationimport RealmSwiftclass RealmMigration { func didApplicationLunch () { self.migrationVersion() } func migrationVersion() { let config = Realm.Configuration( schemaVersion : 1 , migrationBlock : { migration , oldSchemaVersion in // if (oldSchemaVersion < 1) {// 如果你有必须针对旧板本迁移到新板本的资料改变,就写在这里。// 详细的做法可以参考官方的範例// } } ) Realm.Configuration.defaultConfiguration = config } }let realm = try! Realm() //不要理会这一行是不是会报黄色警告给你,写在这完完全全就是让realm这个变数变成全域使用。你就不用每一次都下这一行。
不过光是这样设置是没用的,因为这个class还没有在app开启时被执行。
如果你没有预设在app执行时先跑这个class,那么你改了结构就一样会报error给你。
修改:AppDelegate.swift
在class AppDelegate中追加下面这行
let realmMigration:RealmMigration = RealmMigration()
将
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { return true}
改成
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.realmMigration.didApplicationLunch() return true}
这时再执行编译的话,之后迁移就会发生作用了。
至于改了结构要如何迁移?很简单!
你只要去改版本号就好了。
例如现在的版本号是:
schemaVersion : 1 ,
你改了结构后,就把版本号加1就好了:
schemaVersion : 2 ,
在下一次的编译中,他就会自动帮你迁移结构了。
但你改了结果却没有改版本号的话,就会发生错误。
--
[目次]
[Swift] Realm.io 资料库介绍 - 其之一:初探CRUD
[Swift] Realm.io 资料库介绍 - 其之二:Migrations 迁移
[Swift] Realm.io 资料库介绍 - 其之三:查询、排序、键结、自动更新、笔数