[Realm][Swift4対応 完全保存版] 5.データの更新と削除

はじめに

前回はRealmにおけるクエリについて説明をしました。

第5回目となる今回は、既存データの更新と削除をする方法について説明します。

過去記事は以下を参照ください。

環境

Xcode:9.4.1
Swift:4.1.2
Realm:3.7.4

目次

  1. 前準備
  2. データの更新
  3. データの削除
  4. Realmファイルの削除

“[Realm][Swift4対応 完全保存版] 5.データの更新と削除” の続きを読む

[Realm][Swift4対応 完全保存版] 4.クエリによるデータの取得

はじめに

前回はRealmにおけるモデルオブジェクトの作成方法とデータベースへの書き込み方法について説明しました。

第4回目となる今回は、クエリを使用してデータベースからデータを取得する方法について説明します。

過去記事は以下を参照ください。

環境

Xcode:9.4.1
Swift:4.1.2
Realm:3.7.4

目次

  1. 前準備
  2. 全データの取得
  3. 件数の取得
  4. 各レコードデータの参照
  5. filterによるクエリ
  6. 並べ替え

“[Realm][Swift4対応 完全保存版] 4.クエリによるデータの取得” の続きを読む

[Realm][Swift4対応 完全保存版] 3.モデルオブジェクトの作成と書き込み

はじめに

前回はRealmにおけるモデルの定義について説明しました。

第3回目となる今回は、モデルからインスタンスを生成してデータを設定し、データベースに書き込むまでを説明します。

過去記事は以下を参照ください。

環境

Xcode:9.4.1
Swift:4.1.2
Realm:3.7.4

目次

“[Realm][Swift4対応 完全保存版] 3.モデルオブジェクトの作成と書き込み” の続きを読む

[Realm][Swift4対応 完全保存版] 1.CocoaPodsによるRealmのインストールとプロジェクトの作成方法

はじめに

本サイトのアクセスログを見ると、Swiftで使用できるデータベースフレームワーク「Realm」の記事への参照が多いようです。

そこで、もっと詳細な説明を加えた、Swif4向けの完全保存版を作成することとしました。

第1回目となる今回は、プロジェクトを作成し、Realmをプロジェクトに組み込むまでを説明します。

なお、過去記事にてCarthageによるRealmの導入方法について説明しましたが、今回はCocoaPodsによるRealmのインストール方法について説明します。

※筆者としては、CocoaPodsによるRealmの組み込みの方が簡単だと感じました。

なお、CocoaPodsのインストール方法については、「CocoaPodsの導入」の記事を参照してください。

環境

Xcode:9.4.1
Swift:4.1.2
Realm:3.7.4

目次

  1. プロジェクトを作成する
  2. podファイルを作成する
  3. podファイルを編集する
  4. Realmをインストールする

“[Realm][Swift4対応 完全保存版] 1.CocoaPodsによるRealmのインストールとプロジェクトの作成方法” の続きを読む

[Realm] モデルを作成してデータを登録する

はじめに

Realmは様々なプラットフォームで使用可能な軽量データベースです。

Realmのインストールについては、過去の記事「CarthageとRealmのインストール」を参照してください。

本記事では、Realm用のモデル作成とデータの登録方法について備忘録として記載します。

環境

Xcode:9.2
Swift:4.0.3
RealmSwift:3.3.2

プロジェクトの作成

新規でSingle View Appのプロジェクトを作成したら、過去記事を参考にSwiftRealmを導入します。

モデルの作成

ここでは、部署と部署に属する社員を管理するモデルを作成します。

部署モデルでは、「部署名」とマネージャーの「氏名」、部に属する「社員」を管理できるようにします。

新規で「Department.swift」というSwift Fileを作成し、Departmentクラスを以下のように作成します。

import Foundation
import RealmSwift

class Department: Object {
    // 部署名
    @objc dynamic var name : String = ""
    // マネージャーの氏名
    @objc dynamic var manager : String = ""
    // 部に属する社員
    let employees = List<Employee>()
    
    // プライマリーキー
    override static func primaryKey() -> String? {
        return "name"
    }
    
    // インデックス
    override static func indexedProperties() -> [String] {
        return ["name"]
    }
}

Realm用のモデルを作成するには、「import RealmSwift」が必要です。また、クラスはObjectを継承する必要があります。

モデルに登録するそれぞれの項目はプロパティとして定義します。このとき「@objc dynamic var」で宣言します。

プロパティで使用できるデータ型にはBool、Int、Int8、Int16、Int32、Int64、Double、Float、String、Date、とDataがあります。

部署名やマネージャーの氏名は文字列を登録しますのでString型にしています。

また、部に属する社員は複数登録できるようにList<epmplyee>としています。

次に、社員を管理するEmplyeeクラスを作成します。このクラスは先ほど作成したDepartment.swiftの中に作成しても構いません。

class Employee : Object {
    // 社員の氏名
    @objc dynamic var name: String = ""
    // 社員の年齢
    @objc dynamic var age: String = ""
}

以上でモデルの作成は完了です。

データを登録してみる

それではデータを登録してみましょう。

はじめに部署のみを登録する方法をみてみます。

let realm = try! Realm()  // Realmの初期化

// Engineer型オブジェクトの作成
let dept = Department()
// Realmへのオブジェクトの書き込み
try! realm.write {
    dept.name = "システム部"
    dept.manager = "Bill"
    realm.add(dept)
}

はじめにRealmの初期化を行います。

次に、部署を管理するEngineerのオブジェクト(インスタンス)を作成します(4行目)。

あとは、realm.writeメソッドを使用してデータを登録します(6行目以降)。

Realm Browserで確認すると以下のようにデータが登録できていることが確認できます。参考「[Tips] Realmファイルの保存先を知るには?

この時点ではEmployeesは「0」になっているので登録されていないことがわかります。

子データを登録する

今度は、部署に属する社員を登録してみましょう。

社員を登録するには、まず登録先の部署を検索して取得する必要があります。

検索するにはRealmインスタンスのobjectsが持つfilterメソッドを使用します。以下にコード例を示します。ここでは「nameが’システム部’と等しい」を条件にして抽出しています。

let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first

つづいて、部に追加する社員を作成します。

let emp = Employee()
emp.name = "Oscar"
emp.age = "23"

あとは、writeメソッドを使用して登録をするだけです。部を検索して社員を登録するまでのコードを以下に示します。

let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first
let emp = Employee()
emp.name = "Oscar"
emp.age = "23"
try! realm.write {
    dept?.employees.append(emp)
}

登録が成功すると以下のように社員が登録できていることを確認できます。

子データを削除する

続いて子データを削除してみましょう。

先ほどのfilterメソッドを使用して、システム部を検索し、さらにシステム部に属する「Oscar」を削除する場合は以下のようにします。

// 子データの削除
let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first
let emp = dept?.employees.filter("name == 'Oscar'").first

try! realm.write {
    realm.delete(emp!)
}

削除はrealm.writeメソッドの中で「realm.delete(削除したいオブジェクト)」とします。

親データを削除する

親データも子データ同様にfilterメソッドで特定して削除をします。

// 親データの削除
let realm = try! Realm()
let dept = realm.objects(Department.self).filter("name == 'システム部'").first

try! realm.write {
    realm.delete(dept!)
}

Realmファイルを削除するには

Realmによるデータは、Realmファイルに格納されます。何らかの事情でリセットしたい場合は以下のコードを書くことでまっさらにすることができます。

let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
let realmURLs = [
    realmURL,
    realmURL.appendingPathExtension("lock"),
    realmURL.appendingPathExtension("note"),
    realmURL.appendingPathExtension("management")
]
for URL in realmURLs {
    do {
        try FileManager.default.removeItem(at: URL)
    } catch {
        // handle error
    }
}

[Realm] CarthageとRealmのインストール

Swiftで軽量データベースRealmを使用するにはCarhage(カーセージ)のインストールが必要です。

そこで、Carthageをインストールしてみたので覚え書きとして手順を残しておきます。

2018/07/31追記

RealmはCocoaPodsでもインストールが可能です。

[Tips] CocoaPodsによるRealmのインストール」の記事を追加しましたので、そちらも参照ください。

1.Carthageのインストール

はじめに https://github.com/Carthage/Carthage/releases にアクセスします。

Charthageのpkgファイルがあるので、ダウンロードして実行します。

2.Cartfileの作成

目的のライブラリをインストールするには、はじめにCartfileと呼ばれるファイルを作成する必要があります。

terminal.appを開いて、プロジェクトフォルダへ移動し以下のコマンドを実行します。

touch Cartfile

すると、以下のようにCartfileが作成されます。

Realmのインストール

次に作成したCartfileを編集して、Realmをインストールする準備をします。

Cartfileは以下のように編集します。

github "realm/realm-cocoa"

続いて、terminal.appでプロジェクトのディレクトリに移動し、以下のコマンドを実行します。

carthage update

成功すると、プロジェクトフォルダ配下に以下のファイルが作成されます。

  • Cartfile.resolved
  • Cartage/Build

プロジェクの設定

続いてプロジェクトを開いてRealmを使用できるように設定をしていきます。

はじめに、プロジェクトナビゲータでプロジェクトを選択したら、「Build Phases」を選択して、左側にある[+]ボタンをクリックします。メニューが表示されるので

Run Scriptの欄に以下を追加します。

/usr/local/bin/carthage copy-frameworks

Input Filesに以下を追加します。

$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

次に「General」タブを選択して、「Linked Frameworks Libraries」の中にある[+]ボタンをクリックします。

ライブラリの選択画面になるので、[Add Others]ボタンをクリックして以下の2つのファイルを追加します。

  • Carthage/Build/(対象デバイス)/RealmSwift.framework
  • Carthage/Build/(対象デバイス)/Realm.framework

 

以上でライブラリの追加が完了です。

あとは、Realmを使用したいファイル内で以下を記述して使用します。

import RealmSwift