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

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

ただいまの
回答率

89.25%

Swift5.2 Realmswift データの登録に失敗する。- Property '(ファイル名).(変数名)' has been added., Error Code=10}

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 47

dinoymzk

score 0

前提・実現したいこと

Realmswift初学者です。習熟をすすめています。
一つの変数ではDBへの登録は成功するのですが、二つ以上だと失敗します。
2つ以上のデータを登録し、データがすでに存在する場合は上書きを、データがない場合は追加をするようにしたいです。
また、片方を主キーとして登録をしたいです。

realmに2つ以上の変数を登録したいのです。
できれば、主キーを登録してデータを引き出せるようにしたいです。
同じ問題に当たっている方も多いかと思いますのでご教示いただければと思います。

発生している問題・エラーメッセージ

エラーメッセージ

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:

  • Property 'Todo.namae' has been added." UserInfo={NSLocalizedDescription=Migration is required due to the following errors:
  • Property 'Todo.namae' has been added., Error Code=10}

```ここに言語名を入力
swift5.2

試したこと
realmの公式サイトでは第二引数が.modifiedになるように記述があるのですが、うまくいかないです。

ソースコード
ソースコードは次のとおりです。

登録可能
Todo.swift
import UIKit
import RealmSwift

class Todo: Object {
@objc dynamic var text = ""
}

import UIKit
import RealmSwift

ViewCotroller.swift
import UIKit
import AudioToolbox
import RealmSwift

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
}
let todo = Todo()
// Get the default Realm
let realm = try! Realm()
todo.text = "○"
try! realm.write {
realm.add(todo)
}

登録不可(Primarykey登録記述の有無にかかわらずエラーが出る
Todo.swift
class Todo: Object {
// ID : プライマリーキー項目(項目名は任意です)
@objc dynamic var namae = ""
@objc dynamic var text = ""

override static func primaryKey() -> String? {
return "id"
}
}

ViewCotroller.swift
import UIKit
import AudioToolbox
import RealmSwift

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
}
let todo = Todo()
// Get the default Realm
let realm = try! Realm()
todo.text = "○"
try! realm.write {
realm.add(todo, update: .all)
//realm.add(todo)
//realm.add(data1, update: true)
//realm.add(data1, update: .modified)

}

補足情報(FW/ツールのバージョンなど)

Xcode Version 11.5 
macOS Catalina 10.15.4
RealmSwift 5.0

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error > Domain=io.realm Code=10 "Migration is required due to the following errors:

    Property 'Todo.namae' has been added." UserInfo= {NSLocalizedDescription=Migration is required due to the following errors:
   Property 'Todo.namae' has been added., Error Code=10}

上記のエラーメッセージを読むと、「下記の理由によりマイグレーションが必要になります」とあります。

また、続くメッセージにはTodo.namaeというプロパティが追加されました、ともあります。

実際、

登録可能
class Todo: Object {
    @objc dynamic var text = ""
}

とあった最初のオブジェクトモデルと比較すると、

登録不可(Primarykey登録記述の有無にかかわらずエラーが出る
class Todo: Object {
    // ID : プライマリーキー項目(項目名は任意です)
    @objc dynamic var namae = ""
    @objc dynamic var text = ""

    override static func primaryKey() -> String? {
        return "id"
    }
}

`

とあるように、namaeという名称のプロパティが追加されています。

つまり、オブジェクトに新しいプロパティ(変数)を追加、あるいは削除した場合、次回の起動以降にマイグレーションと呼ばれる処理を行わない限り、実行時エラーとなってしまうのが Realm の仕様となっています。

公式ドキュメントの「マイグレーション」の項を見ても以下のように説明されています。

ここでのポイントは、もし以前に前のデータモデルでのデータが保存されている場合、新しく定義し直したデータモデルとディスクに保存されている古いデータモデルとの間に不整合が生じてしまいます。 マイグレーションを実行せずにRealmを使おうとすると、例外が発生します。

これを回避するには

  1. マイグレーション処理を記述する
  2. 別の新たなプロジェクトを立ち上げる
  3. インメモリで実行する
  4. その他

の4つの対策があります。 ちなみに4つ目は Realm のデータベースを削除する方法などですが、これは実際に確かめたことがないので成功するかわかりません。

マイグレーション実行については、オンラインドキュメントの「マイグレーションを実行する」が参考になるかと思います。

インメモリで実行、つまりファイルとしてデータベースを残さない方法については、下記のような感じで実行できます(Playgroundで試すときには下記の方法を使っています)。

let realm = try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "MyInMemoryRealm"))

ちなみに、プライマリーキーとして"id"を指定されていますが、idという名前のプロパティがないため、このままではプライマリーキーを必要とするメソッドの実行時にエラーが出る可能性があるかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.25%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • iOSに関する質問
  • Swift5.2 Realmswift データの登録に失敗する。- Property '(ファイル名).(変数名)' has been added., Error Code=10}