[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が一番しっくりくる気がする。
この記事が気に入ったらサポートをしてみませんか?