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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1329閲覧

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

dinoymzk

総合スコア2

Realm

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/23 01:12

編集2020/05/23 01:40

前提・実現したいこと

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 ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答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というプロパティが追加されました、ともあります。

実際、

Swift

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

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

Swift

1登録不可(Primarykey登録記述の有無にかかわらずエラーが出る 2class Todo: Object { 3 // ID : プライマリーキー項目(項目名は任意です) 4 @objc dynamic var namae = "" 5 @objc dynamic var text = "" 6 7 override static func primaryKey() -> String? { 8 return "id" 9 } 10}

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

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

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

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

これを回避するには

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

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

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

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

Swift

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

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

投稿2020/05/23 01:56

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問