SwiftでiOS開発をする際にローカルのデータベースとしてRealmを採用しています。
Realmを使っていると、Schemaの構造が変更されるたびにマイグレーションを行わないとアプリがクラッシュしてしまいます。
今回は、Realmの公式サイト通りにマイグレーションを実行したのですが、うまくいかなかったため、その解消法を紹介します。
やりたかったこと
1 2 3 4 5 6 7 8 9 10 |
import Foundation import RealmSwift class DoneTask: Object { @objc dynamic var taskId : Int = 0 @objc dynamic var taskName : String = "" @objc dynamic var point : Int = 0 @objc dynamic var date : Date = Date() } |
上記のあらかじめ定義してあるスキーマに
【@objc dynamic var category : Int = 0】
を追加します。
既にDoneTaskモデルのデータがRealmに登録されている場合、安易に
1 2 3 4 5 6 7 8 9 10 11 |
import Foundation import RealmSwift class DoneTask: Object { @objc dynamic var taskId : Int = 0 @objc dynamic var taskName : String = "" @objc dynamic var point : Int = 0 @objc dynamic var date : Date = Date() @objc dynamic var category : Int = 0 } |
としてしまうと、エラーが発生します。
というのも、Realmではデータ構造を変更するときはMigration処理をいれなければならないからです。
Migration(公式)
https://realm.io/docs/swift/latest/#migrations
こちらのRealmの公式サイトに書いてあるマイグレーション方法を実行すれば、すぐにできるじゃん!!
と思い、
1 2 3 4 5 6 7 8 |
let config = Realm.Configuration( schemaVersion: 1, migrationBlock: { migration, oldSchemaVersion in if (oldSchemaVersion < 1) {} }) Realm.Configuration.defaultConfiguration = config let realm = try! Realm() |
と公式サイトのソースをそのまま、【application(application:didFinishLaunchingWithOptions:)】内で実行したのですが、マイグレーションをしてくださいというエラーが発生してうまくデータベースを作成できませんでした。
Migration(成功した方法)
1 2 3 4 5 6 7 8 9 |
var config = Realm.Configuration( schemaVersion: 4, migrationBlock: { migration, oldSchemaVersion in if (oldSchemaVersion < 4) {} }) Realm.Configuration.defaultConfiguration = config config = Realm.Configuration() config.deleteRealmIfMigrationNeeded = true |
【config.deleteRealmIfMigrationNeeded = true】
これを追加して、上記の書き方に変更したら、うまくマイグレーションが出来ました!
まだ、アプリ制作、初心者ですが、なんかしらアプリを作ってリリースしてみたいと思います笑