質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

4252閲覧

RealmSwiftでカラムを追加したい

Zan

総合スコア24

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/09/12 05:30

###既存のObjectに「id」という名前の新たなカラムを追加したい。
開発中の未公開アプリなので、マイグレーションではなく、古いものを完全に消してて新規作成で構いません。

###まず単純にidカラムを追加すると、以下のエラーが出ます。

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors: - Property 'id' has been added to latest object model." UserInfo={Error Code=10, NSLocalizedDescription=Migration is required due to the following errors: - Property 'id' has been added to latest object model.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-703.0.18.8/src/swift/stdlib/public/core/ErrorType.swift, line 54

###各カラムは以下の様な感じで定義しています。

Swift

1class WordDic: Object { 2 dynamic var codeKana:String = "" 3 dynamic var standardNotation:String = "" 4 dynamic var kanji:String = "" 5 dynamic var alphabet:String = "" 6 dynamic var id:Int = 0

以前(バージョン0.9xのRealmSwift使用時)、クラス名を「WordDic2」のように新しい名前をつけかえると問題なく動いたので、最初それを試したのですが、今回同じことをすると、以下のコードを実行した際、検索結果(resultsの中身)が空の状態になってしまいました。

let results = realm.objects(WordDic2).filter(filterValue)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージの通り、既存のRealmファイルとモデルクラスの定義が異なってしまったためにマイグレーションが必要です。おっしゃるように保存されているデータを失うのが問題ないのであれば、ファイルを消して作り直せばいいです。

方法としてはいくつかありますが、簡単なのはRealm.Configuration.deleteRealmIfMigrationNeededtrueにしてRealmを作成します。そうすると、マイグレーションが必要な場合は自動的にファイルを消して作り直してくれます。

swift

1let config = Realm.Configuration(deleteRealmIfMigrationNeeded: true) 2let realm = try! Realm(configuration: config)

それ以外の方法としては、自分でNSFileManagerなどのAPIを用いてファイルを消す/移動する、アプリケーション自体を消して再インストールなどがあります。

ちなみにマイグレーションは基本的に自動で行われるので、追加したカラムにデータを移行したいということがないのであれば、単にスキーマバージョンを上げるだけでOKです。schemaVersionには既存のファイルのバージョンより大きな値を指定します。

swift

1let config = Realm.Configuration(schemaVersion: 1) 2Realm.Configuration.defaultConfiguration = config 3 4let realm = try! Realm()

投稿2016/09/12 11:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zan

2016/09/12 20:56

おかげさまでうまくいきました。いつも丁寧に説明していただいてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問