2018/02/03

【永久保存版】RealmSwiftの使い方 – Swift4.0

ちょっとずつ更新中。
長いので、目次からか、ブラウザの文字検索が無難。

目次

Realmのインスタンスを取得

モデル定義

コードの説明

let realm = try Realm()でインスタンスを取得するのが重要
ただ取得しただけ

モデルオブジェクトを生成して、各プロパティに値を設定

モデル定義

一個上と同じ

コードの説明

let dog = Dog()でオブジェクトの生成するとオブジェクトに値を設定して初期化することが可能
ただこれは値を設定しただけなので、データベースに保存(永続化)されていない。

各プロパティへの値の設定方法は辞書と配列で初期化することも可能

辞書:let dog(value: [“name”:”Momo”],”age”:9)]
配列:let dog(value: [“Momo”,9])
*配列の場合には、全てのプロパティの値を含み、且つモデル内の定義と同じ順序でなければ不可。

データベースへの書き込み(write, add)

モデル定義(記載有り)

コードの説明

「try! realm.write」内に「realm.add(person)」で追加完了

デバッグエリアの出力内容

print(“成功だよ”, person)の内容です。
*printはカンマ区切りで複数指定できる

データベースへの書き込み(複数オブジェクト)

モデル定義

一個上と同じ

コードの説明

addはコレクション(配列や辞書的なこと)として渡すことで、まとめて追加することも可能

デバッグエリアの出力内容

データベースへの追加(関連するオブジェクトも一緒に)

モデル定義

一個上と同じ

コードの説明

追加は、そのモデルオブジェクトが持つ関連(1対1,1対多)も一緒に追加される

デバッグエリアの出力内容

PersonとCat(=cats)は1対多の関連がある。
また、ListはコレクションクラスでArrayとよく似た性質を持っているので、[0],[1]というように、順番が保持できる。

モデルオブジェクトの更新

モデル定義

一個上と同じ

コードの説明

データベースに保存したモデルオブジェクトのプロパティの値を更新すると新しい値がデータベースに反映される。
当然だが、プロパティの値を更新するのみなので、realm.addは使わない。
・アンマネージドオブジェクト:Realmに保存する前のもの
・マネージドオブジェクト:Realmに保存済みのもの

デバッグエリアの出力内容

プロパティを変更したので、1回目と2回目でmoodの値が変更している

1対多関連の追加と削除(List,append,remove)

モデル定義

一個上と同じ

コードの説明

Listクラスには配列や辞書と似たコレクションクラスなので、使い方も結構似てます。

デバッグエリアの出力内容

要素を取り除いた場合は、あくまでList内から取り除かれるだけで、取り除いたモデルオブジェクトはデータベースから削除されない。

モデルオブジェクトの更新(キー値コーディング)setValue(_:forKey:)

モデル定義

一個上と同じ

コードの説明

先ほどの「モデルオブジェクトの更新」とやろうとしていることは変わらないです。
・setValue(_:forKey:)で値を更新
・ListはsetValue(_:forKeyPath:)で値を更新?(多分)

デバッグエリアの出力内容

2回目だと、person.moodが更新。
3回目だと、person.dog.ageが更新。

コレクションクラス(List,Result)の一括更新(キー値コーディング)

モデル定義

一個上と同じ

コードの説明

コレクションクラスであるListクラスとResultクラスはキー値コーディングに準拠しており、全て一括して更新可能。

デバッグエリアの出力内容

person.cats.ageがそれぞれ更新されている。

モデルオブジェクトの削除(delete)

モデル定義

一個上と同じ

コードの説明

Realmデータベースからモデルオブジェクトを削除するにはdelete(_:)、deleteAll()を使用。
削除後のモデルオブジェクトは無効になり、モデル定義したプロパティにアクセスするとクラッシュする

デバッグエリアの出力内容

複数のモデルオブジェクトを一度に削除

モデル定義

一個上と同じ

コードの説明

複数のモデルオブジェクトを一度に削除したい場合には、delete(_:)にコレクションクラス(配列、List、Results、LinkingObjectなど)を渡します。

デバッグエリアの出力内容

Listであるcatsが削除されています。

全てのモデルオブジェクトを削除(deleteAll)

モデル定義

一個上と同じ

コードの説明

deleteAll()を使用すると、全て削除可能

デバッグエリアの出力内容

モデルオブジェクトの取得(Results)

モデル定義(記載あり)

Resultsの説明

データベースに保存したモデルオブジェクトは、クエリ(検索条件)から取得可能。
クエリが実行されるとモデルオブジェクトを含むResultsクラスのインスタンスが返ってくる。
Resultsは読み取り専用のコレクションクラスですが、取得時に指定したクエリの実行結果が自動で反映される特殊なコレクションクラスで、直接Resultsクラス内の要素を編集する必要がない仕組み。
Resultsはコピーではなく、書き込みトランザクション(realm.write)を使って、Results内のデータを変更した場合には、データベースに反映される。

コードの説明

Realmデータベースに保存されている特定のモデルクラスのオブジェクトを全て取得するにはRealmクラスのobjects(_:)を使用。

デバッグエリアの出力内容

データベース追加前と追加後で、オブジェクト数が0 -> 1になっています。

ソート(並び替え)を行う(sorted)

モデル定義

一個上と同じ

コードの説明

1つまたは複数のプロパティの値を使ってソートすることが可能。
ソートは、(byKeyPath:ascending:)などを使用

デバッグエリアの出力内容

検索条件でのコレクションの絞り込み(filer)

モデル定義

一個上と同じ

コードの説明

クエリの指定はfilter(_:_:)を使用する

デバッグエリアの出力内容


お知らせ

ヒヨコ歩数計という歩きながらヒヨコが育っていくアプリを作って、いろんな方に結構使ってもらっています。
RealmSwift, Admobの動画・インステ・バナー広告、UICollectionView、iOS-Charts、UITableViewを使用しているので、是非ご利用ください!