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

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

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

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

Swift

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

Q&A

解決済

1回答

2983閲覧

【Swift4】Realmのデータ削除について

aiskw

総合スコア16

Realm

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

Swift

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

0グッド

0クリップ

投稿2019/06/18 13:39

前提・実現したいこと

度々のご質問失礼します。
下記状況において、Realmに登録したデータの更新(削除)方法がわかりません。

1.メインビューにてRealmにデータを登録
2.メインビュー内のセルをタップで別ビューに遷移し、値を編集する(モーダルで遷移)
3.別ビューで編集した値を登録する
4.別ビューに渡して編集済みの元の値は削除する

下記コードにて実装を試みているのですが、そもそもの考えとして、上記3と4は分ける必要はあるのでしょうか?
色々なサイトやTeratail内の質問も見たのですが、3と4を一度にやる方法(上書き)が分からないため、
別々に試しています。
その上でご教示いただきたいのですが、上記3と4を一度に行う方法はあるのでしょうか?

また、別々に行う場合、4については下記コードをどのように修正していけば良いのでしょうか?
メインビューから選択されたセルのindexPathを渡すなど色々と試してみたのですが、
RealmでのindexPathの扱い方などがわかりません。

お手数をおかけしますが、よろしくお願いいたします。

該当のソースコード

ViewController

1mport UIKit 2import RealmSwift 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 var realm: Realm! 7 var phraseList: Results<PhraseItem>! 8 9 @IBOutlet weak var inputTextView: UITextView! 10 11 @IBOutlet weak var tableView: UITableView! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 tableView.delegate = self 17 tableView.dataSource = self 18 } 19 20 override func viewWillAppear(_ animated: Bool) { 21 realm = try! Realm() 22 phraseList = realm.objects(PhraseItem.self) 23 24 tableView.reloadData() 25 } 26 27 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 28 return phraseList.count 29 } 30 31 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 32 let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 33 cell.textLabel?.text = phraseList[indexPath.row].phrase 34 35 return cell 36 } 37 38 @IBAction func inputButton(_ sender: Any) { 39 let newPhrase = PhraseItem() 40 newPhrase.phrase = inputTextView.text! 41 42 let realm = try! Realm() 43 try! realm.write { 44 realm.add(newPhrase) 45 } 46 47 inputTextView.endEditing(true) 48 inputTextView.text = "" 49 self.tableView.reloadData() 50 } 51 52 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 53 tableView.deselectRow(at: indexPath, animated: false) 54 performSegue(withIdentifier: "goEdit", sender: indexPath.row) 55 } 56 57 func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { 58 } 59 60 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 61 if let indexPath = tableView.indexPathForSelectedRow { 62 let selectedRow = indexPath.row 63 let editVC = segue.destination as! EditViewController 64 editVC.receiveText = phraseList[selectedRow].phrase 65 editVC.receiveRow = selectedRow 66 67 print(editVC.receiveText) 68 print(editVC.receiveRow) 69 } 70 } 71 72} 73

EditViewController

1import UIKit 2import RealmSwift 3 4class EditViewController: UIViewController { 5 6 var receiveText: String? 7 8 var receiveRow: Int? 9 10 @IBOutlet weak var editTextView: UITextView! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 editTextView.text = receiveText 16 } 17 18 @IBAction func editButton(_ sender: Any) { 19 if let editText = editTextView.text { 20 let realm = try! Realm() 21 let editedText = PhraseItem() 22 editedText.phrase = editText 23 try! realm.write { 24 realm.add(editedText) 25 } 26 } 27 dismiss(animated: true, completion: nil) 28 } 29}

PhraseItem

1import UIKit 2import RealmSwift 3 4class PhraseItem: Object { 5 @objc dynamic var phrase = "" 6 7}

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

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

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

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

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

guest

回答1

0

ベストアンサー

引用テキスト3と4を一度にやる方法(上書き)

Swift

1try! realm.write { 2 realm.add(newPhrase, update: true) 3}

という書き方ができます。
既存のデータのprimaryKeyを把握する必要はありますが、updateをtrueにすれば、newPhraseと同じprimaryKeyのデータが存在すれば、上書きしてくれます。

■追記
Realm Documentation オブジェクトの更新

Realmのオブジェクトを更新するにはいくつかの方法があります。それぞれの方法には、状況によって異なるトレードオフがあるので、状況に応じて適切な方法を選択してください:

プロパティへの代入
プライマリキーを使ってオブジェクトを作成・更新する
キー値コーディング

投稿2019/06/19 01:19

編集2019/06/19 01:27
dsuzuki

総合スコア1682

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

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

aiskw

2019/06/19 03:22

ご回答および参考リンクまでいただきありがとうございます。 上記のような方法があるのですね。 ぜひ試してみたいと思います。 もしまた不明点などあれば質問させていただくかもしれませんが、お手すきの際にはご回答いただけますと幸いです。
aiskw

2019/06/20 02:41

dsuzuki様 ご回答をいただいた方法にて試してみたところ、無事に希望通りの動きが実装できました! 参考リンクなど含め、大変勉強になりました。 この度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問