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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

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

Q&A

解決済

1回答

622閲覧

Realm オブジェクトが一つしかない時の保存の仕方

tsuji71

総合スコア17

Realm

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

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

0グッド

0クリップ

投稿2020/06/08 13:14

作りたいもの

ここ一ヶ月ほどRealmを使って色々と勉強していたのですが、考えている内によくわからなくなってしまったので質問いたします

今までは複数のオブジェクトが存在するToDoアプリのようなものを作っていたのですが、今回はアプリに設定したテキストを保存しておきたいため、ToDoアプリのようにその都度新しいオブジェクトを作成するのではなく、最初に生成したオブジェクトを更新していく形にしようとしています

わからないこと

これまでは

swift

1let realm = try! Realm() 2 var dataListArray = try! Realm().objects(RealmDataList.self) 3 var realmDataList: RealmDataList! 4 5realmDataList = dataListArray[0]

のようにして値を取得していたのですが、今回は複数のオブジェクトは存在しないため、以下のようなコードでできるかと思ったのですが、入力した文字が一度はRealmに保存されているのはプリントでわかるものの、再びViewDidLoadが呼ばれると消えてしまいます

swift

1class AppDetail: Object { 2 3 @objc dynamic var memoText = "" 4}

swift

1class DetailViewController: UIViewController { 2 3 let realm = try! Realm() 4 let appDetail = AppDetail() 5 6 7 @IBOutlet weak var memoTextView: UITextView! 8 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // Do any additional setup after loading the view. 15 16 memoTextView.text = appDetail.memoText 17 } 18 19 @IBAction func returnButton(_ sender: Any) { 20 21 try! realm.write { 22 appDetail.memoText = memoTextView.text 23 realm.add(appDetail) 24 25 print(appDetail.memoText) 26 self.dismiss(animated: true, completion: nil) 27 } 28 29 } 30 31 32}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1 let realm = try! Realm() 2 let appDetail = AppDetail()

Realmのインスタンスと保存したいオブジェクトのインスタンスを作っただけでは関連づけられていません(データベースからは読み込まれません)。

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 4 // Do any additional setup after loading the view. 5 memoTextView.text = appDetail.memoText 6 }

このように記述しても memoText""のままとなってしまいます。

従って、以前保存したデータを読み込みたいのであれば、逐一オブジェクトを取得する必要があります。

Swift

1class ViewController: UIViewController { 2 3 let realm = try! Realm() 4 var appDetail: AppDetail! 5 6 @IBOutlet weak var memoTextView: UITextView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // Do any additional setup after loading the view. 12 if let obj = realm.objects(AppDetail.self).first { 13 appDetail = obj 14 memoTextView.text = appDetail.memoText 15 } else { 16 appDetail = AppDetail() 17 } 18 } 19 20 @IBAction func returnButton(_ sender: Any) { 21 try! realm.write { 22 appDetail.memoText = memoTextView.text 23 realm.add(appDetail) 24 25 print(appDetail.memoText) 26 } 27 } 28}

上記の例では、appDetailはオプショナル型として宣言しておき、viewDidLoadでインスタンスを代入するようにしています。ここで、過去に保存したオブジェクトがあれば関連づけを行います。

objects()は配列の形としてオブジェクトを取得するため、ここではfirstで先頭の要素だけ取得しています。オプショナルバインディングを行っているため、先頭の要素がない(つまり、初回の起動である)場合いは、appDetailには新しいオブジェクト(インスタンス)を代入しています。

ちなみに、同じクラスでappDetailを使い回すのであれば、下記のように書き換えることも可能です。

Swift

1class ViewController: UIViewController { 2 3 let realm = try! Realm() 4 var appDetail: AppDetail! 5 6 @IBOutlet weak var memoTextView: UITextView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // Do any additional setup after loading the view. 12 if let obj = realm.objects(AppDetail.self).first { 13 appDetail = obj 14 memoTextView.text = appDetail.memoText 15 } else { 16 appDetail = AppDetail() 17 18 // ここで一度保存してマネージドオブジェクトにする 19 try! realm.write { 20 realm.add(appDetail) 21 } 22 } 23 } 24 25 @IBAction func returnButton(_ sender: Any) { 26 try! realm.write { 27 appDetail.memoText = memoTextView.text 28 // realm.add()は不要になるが、書き込みは realm.write {} 内部で行う 29 30 print(appDetail.memoText) 31 } 32 } 33}

投稿2020/06/09 03:45

TsukubaDepot

総合スコア5086

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

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

tsuji71

2020/06/09 05:52

なるほど、とてもよくわかりました。丁寧なご回答をありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問