見出し画像

[Swift]Realmでデータの永続化

Realmでデータを永続化する方法をご紹介します。
データを操作するCRUD処理のうち、今回はCreateとReadについて記載します。

追記:Update、Deleteについて記事書きました。

前提:Realm Swift SDKをインストールしておく

CocoaPods、SPM(SwiftPackageManager)などを使用してプロジェクトにRealmをインストールします。
詳細は以下のページを参照。
https://www.mongodb.com/docs/realm/sdk/swift/install/#std-label-ios-install

今回扱うデータのER図

Categoryに対してItemが1対多の関係で紐付いているものとします。

データクラスを作成

上記ER図に従ってデータクラスを作成します。

[Category.swift]
~~~
import Foundation
import RealmSwift

class Category: Object {
    @Persisted var name: String = ""
    @Persisted var items = List<Item>()
}


[Item.swift]
~~~
import Foundation
import RealmSwift

class Item: Object {
    @Persisted var title: String = ""
    @Persisted var done: Bool = false
    var parentCategory = LinkingObjects(fromType: Category.self, property: "items")
}

まずRealmの機能を使用するために、「RealmSwift」をインポートします。
各クラスはObjectを継承し、各プロパティに「@Persisted」を付与します。
なお、Itemクラスに定義されているリレーションを表すプロパティparentCategoryには「@Persisted」は不要です。

データの取得

import UIKit
import RealmSwift

class CategoryViewController: UITableViewController {

    let realm = try! Realm()

    var categories: Results<Category>?
    var items: Results<Item>?

             :
             :
         :

    func loadCategories() {
        categories = realm.objects(Category.self)
    }

    func loadItems(parentCategory: Category) {
        items = parentCategory.items.sorted(byKeyPath: "title", ascending: true)
    }
}

データの取得は簡単です。
まずloadCategoriesメソッドですが、Categoryのような親データがないものについては、realm.objectsで取得対象のデータクラスを指定して取得できます。
次にloadItemsメソッドですが、こちらは引数の親カテゴリーに既にitemsが属しているため、それをそのまま取得します。

データの書き込み

import UIKit
import RealmSwift

class CategoryViewController: UITableViewController {

    let realm = try! Realm()

    var categories: Results<Category>?

             :
             :
         :

    func saveCategory() {
        let newCategory = Category()
        newCategory.name = "New Category"
            
        do {
            try realm.write({
                realm.add(newCategory)
            })
        } catch {
            print("Error saving new category, \(error)")
        }
    }

    func saveItem(parentCategory: Category) {
        let newItem = Item()
        newItem.title = "New Item"
        
        do {
            try realm.write({
                parentCategory.items.append(newItem)
            })
        } catch {
            print("Error saving new item, \(error)")
        }        
    }
}

まずはsaveCategoryメソッドに注目してください。
Categoryを生成し、realm.writeを実行しデータを書き込みます。
次にsaveItemメソッドですが、引数に親カテゴリーを指定します。そして、realm.write内で親カテゴリーのプロパティにItemを追加することで簡単にデータを書き込むことができます。

最後に

Udemyの講座で、データの永続化方法として、User Defaults、Core Data、Realmとやってきたが、自身が普段の仕事でRDBに触れていることもあり、Realmが一番しっくりくる気がする。

この記事が気に入ったらサポートをしてみませんか?