この記事は2019年01月16日に投稿しました。
目次

絶対に挫折しない iPhoneアプリ開発「超」入門 第6版 【Swift 4 & iOS 11】完全対応
- 作者: 高橋京介
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/11/22
- メディア: Kindle版
- この商品を含むブログを見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
PWEditorで使用しているSwiftのデータベースRealmでデータを更新する方法についてです。
2. SwiftでデータベースRealmでデータを更新する
SwfitのデータベースRealmでデータを更新するには、検索結果または新規登録したモデルオブジェクトのプロパティを書き換えることで行います。
ただしプロパティの書き換えはトランザクション内で行う必要があります。
Realmのモデルクラスをインスタンス化した場合、アンマネージド状態と呼び、通常のクラスオブジェクトと同様にプロパティの書き換えなど行えます。
この場合、データベースに影響はありません。
それに対し検索結果で取得したモデルクラスのオブジェクトや新規登録したモデルクラスのオブジェクトは、マネージド状態と呼び、プロパティを書き換えると即座にデータベースに反映されます。
ただし前述しましたが、プロパティの書き換えはトランザクション内で行う必要があります。
またRealmの仕様上、トランザクションは同一スレッドで行う必要があります。
まとめるとデータの更新は以下の条件で行います。
- 検索結果や新規登録したマネージドのモデルオブジェクトのプロパティの書き換えることでデータが更新されます。
- プロパティの更新はトランザクション内で行う必要があります。
- 同様にプロパティの更新は同一スレッド内で行う必要があります。
実装例
// モデルクラス import RealmSwift class PersonalInfo: Object { // ID @objc dynamic var id = 0 // プライマリーキー項目(項目名は任意です) // 名前 @objc dynamic var name = "" // 年齢 @objc dynamic var age = 0 // 住所 @objc dynamic var address = "" // Eメールアドレス @objc dynamic var email = "" /** プライマリキーのプロパティ名を返却します。 - Returns: プライマリキーのプロパティ名 */ override static func primaryKey() -> String? { return "id" } }
// 更新 let realm: Realm do { realm = try Realm() realm.write() { // トランザクションを開始します。 // PersonalInfoデータを取得します。 // (1件以上登録済みの前提です) let results = realm.objects(PersonalInfo.self) // プロパティnameを"sato"に更新します。 results[0].name = "sato" } } catch { // 必要に応じて、エラー処理を行います。 }
3. おわりに
最初、アンマネージドのモデルオブジェクトを更新しようとして、更新できず四苦八苦しました。
データの更新はわかってしまえば簡単でした。
エンジニアによるエンジニアのためのサイト始まる!!【teratail】

絶対に挫折しないiPhoneアプリ開発「超」入門 第7版 【Xcode 10 & iOS 12】 完全対応 (Informatics&IDEA)
- 作者: 高橋京介
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2018/11/22
- メディア: 単行本
- この商品を含むブログを見る
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688