Swift

【Swift】Realmについて徹底解説〜初心者でもわかるように解説します〜

カズキ

今回はスマホアプリ開発でデータベースとして用いられることの多いライブラリであるRealmについて初心者にも分かりやすいように解説していきたいと思います。

この記事を読むと、

・Realmとは

・Realmを使うためにすること

・データベースの操作方法

などを学ぶ事ができます。

ぜひ最後まで読んでいってください。

Realmとは

Realmは、モバイルアプリケーション向けのオフラインでも使用可能なデータベースです。Realmは、iOSおよびAndroidの両プラットフォームで使用でき、高速かつスケーラブルなパフォーマンスを提供します。Realmは、Objective-C、Swift、Java、Kotlinなどの言語に対応しており、開発者は簡単にデータを保存、検索、更新することができます。また、Realmはクラウドサービスとの統合もサポートしています。

Realmは、高速なパフォーマンス、シンプルなAPI、豊富なデータ型のサポートなどの特長を持っています。

SwiftでRealmを使うためにすること

SwiftでRealmを使うための準備として、以下のステップを踏む必要があります。

  • 1. CocoaPodsをインストールします。CocoaPodsは、iOSおよびmacOSのXcodeプロジェクトで使用されるオープンソースのライブラリ管理システムです。
  • 2. 現在のXcodeプロジェクトにRealmを追加するために、Podfileを作成します。Podfileには、使用するライブラリの名前とバージョンを記述します。
platform :ios, '10.0'
use_frameworks!

target '<Your Target>' do
    pod 'RealmSwift'
end

  3. 作成したPodfileを使って、ターミナルでプロジェクトにRealmをインストールします。

$ pod install
  • 4. Xcodeで、「*.xcworkspace」を開きます。
  • 5. 現在のXcodeプロジェクトにRealmをインポートするために、「import RealmSwift」を追加します。
  • 6. これで、Realmを使用する準備ができました。
  • 注意: これらは基本的な手順です。実際にはアプリケーションに応じて設定が変わることがあります。詳細については、Realmの公式ドキュメントを参照してください。

データベースに保存するデータクラスの定義

Realmでは、データモデルを定義するために、「Object」クラスを継承したカスタムクラスを作成します。このカスタムクラスには、Realmに保存するデータのプロパティを定義します。

例えば、あなたがTODOリストを管理するアプリを作ろうとしていて、「実行する内容」と、「それを実行したかどうか」をデータベースに記録したいとしたなら、「Task」という名前のカスタムクラスを作成し、「taskName」と「isCompleted」という2つのプロパティを定義する必要があります。以下はその例になります。

import RealmSwift

class Task: Object {
    @objc dynamic var taskName = ""
    @objc dynamic var isCompleted = false
}

-「Object」クラスを継承したことにより、Realmは、このクラスのインスタンスを自動的にデータベースに保存します。

-「@objc dynamic」は、プロパティがRealmによって動的に管理されることを示します。

-「taskName」と「isCompleted」は、StringとBool型のプロパティです。

作成したTaskクラスを使って、Realmにデータを保存することができるようになります。

let task = Task()
task.taskName = "Clean the kitchen"
task.isCompleted = false

let realm = try! Realm()
try! realm.write {
    realm.add(task)
}

このように、Realmはカスタムクラスを使用して、データモデルを定義することができます。 Realmでは、リレーショナルデータベースのように、リレーションシップを管理することも可能です。

データベースの操作方法

Realmは、Create(データの保存)、Read(データの取得)、Update(データの更新)、Delete(データの削除) (CRUD) の操作を実行するためのAPIを提供しています。

Create(データの保存)

Realmに新しいオブジェクトを追加するには、「realm.write」ブロックを使用し、「realm.add」メソッドを呼び出します。

let task = Task()
task.taskName = "部屋の掃除"
task.isCompleted = false

let realm = try! Realm()
try! realm.write {
    realm.add(task)
}

Read(データの取得)

Realmからデータを取得するには、「realm.objects」メソッドを使用します。このメソッドは、指定したクエリ条件に一致するオブジェクトを返す「Results」オブジェクトを返します。

let realm = try! Realm()
let allTasks = realm.objects(Task.self)

Update(データの更新)

Realmに保存されたオブジェクトを更新するには、「realm.write」ブロックを使用します。

let realm = try! Realm()
let task = realm.objects(Task.self).first
try! realm.write {
    task?.isCompleted = true
}

Delete(データの削除)

Realmからオブジェクトを削除するには、「realm.delete」メソッドを使用します。

let realm = try! Realm()
let task = realm.objects(Task.self).first
try! realm.write {
    realm.delete(task!)
}

クエリ機能

Realmは、クエリ機能を提供しています。これは、データベースから特定の条件に合ったデータを検索するために使用できます。Realmは、高速な検索を実現するために、インデックスを使用します。Realmは、NSPredicate(iOS)やPredicate(Android)を使用して、クエリを構築することができます。

クエリ機能の実装方法

Realmのクエリ機能を実装するには、以下のステップを踏むことができます。

1. Realmデータベースを開きます。これは、以下のように行います。

let realm = try! Realm()

2. クエリを作成します。これは、RealmのAPIを使用して、NSPredicate(iOS)やPredicate(Android)を使用して、クエリを構築することができます。例えば、次のように、「ageが25以上のPersonオブジェクト」を検索するクエリを作成することができます。

let predicate = NSPredicate(format: "age >= 25")

3. クエリを実行し、結果を取得します。これは、以下のように行います。

let results = realm.objects(Person.self).filter(predicate)

4. クエリの結果を使用します。例えば、結果を表示するために、結果をループして、各オブジェクトのプロパティを表示することができます。

for person in results {
    print(person.name)
    print(person.age)
}

これらのステップを組み合わせることで、Realmのクエリ機能を実装することができます。

トランザクションとスレッドセーフ

Realmは、トランザクションとスレッドセーフなデータベースです。

トランザクション

トランザクションとは、データベースに対する複数の処理をまとめて、一つの処理として扱うことです。Realmでは、トランザクションを開始することで、複数のデータの更新や削除をまとめて、一度に実行することができます。トランザクションを開始するには、Realm.beginWrite()メソッドを使用します。トランザクションの終了は、Realm.commitWrite()メソッドを使用します。

try {
    Realm realm = Realm.getDefaultInstance();
    realm.beginTransaction();
    // Realmオブジェクトを更新する処理
    realm.commitTransaction();
} catch (Exception e) {
    e.printStackTrace();
}

上記の例では、Realm.getDefaultInstance()でRealmのインスタンスを取得し、beginTransaction()でトランザクションを開始し、Realmオブジェクトを更新する処理を行ってから、commitTransaction()でトランザクションをコミットしています。

もし、トランザクション中にエラーが発生した場合は、catchブロックで例外を処理することができます。

スレッドセーフ

スレッドセーフとは、複数のスレッドから同時にアクセスされるデータを安全に扱うことです。Realmは、スレッドセーフなデータベースであり、複数のスレッドから同時にアクセスされても、正確なデータが保証されます。

Realmは、スレッドごとにRealmインスタンスを作成することで、スレッドセーフなアクセスを保証します。そのため、各スレッドで独自のRealmインスタンスを作成し、それぞれのスレッドでトランザクションを開始することで、スレッドセーフなアクセスが保証されます。

まとめ

ここまでRealmについて解説してきました。

皆さんの理解に少しでも役立てたら嬉しいです。

他にもSwiftの記事を書いてるのでよかったら読んでみてください。

また、1人での勉強に限界を感じたらiOSに特化したプログラミングスクール「iOSアカデミア」も検討してみてください!無料相談可能「最短・最速」でiOSエンジニアになれるように手助けしてくれます。