iT邦幫忙

0

[Swift] Realm.io 資料庫介紹 - 其之二:Migrations 遷移

[前言]
上一篇介紹完了基本的結構設計,也講了基本的CRUD。
但是,開發設計中,資料庫的結構是會變動的。
有時可能甚至於發生結構上的失策而需要改動型態之類的。
問題是,如果你單純只是去改結構,那麼在你下一次執行時,勢必會發生編譯錯誤。
因為Realm會自動去判斷你的資料結構是不是符合當前的狀態。
那麼一但你改動了結構,是否就必須有較大的設定改變呢?
其實,這一點,Realm真的都幫我們處理好了。

[設置]
(這邊的設置法則和官方的不太一樣,因為我覺得這樣比較好管理)
基本上,你只需要開個檔案(我檔名都叫RealmMigration.swift)
然後在其中寫入遷移設定就好了。這份設定檔的code基本上就是固定的。
所以其實照抄貼上就行了:

import Foundation
import RealmSwift

class 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 資料庫介紹 - 其之三:查詢、排序、鍵結、自動更新、筆數


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言