【Swift】RealmのDB操作管理クラスのレシピ
はじめに
Realmの文献を見る度に、Realm用の管理クラスが記載されている記事を見たことがないと思いました。
管理クラスを作成すれば、効率良く実装ができるので、折角なので記事に書いておこうと思います。
Realmのことを深く知りたい方は、以下の参考文献を読んで頂ければ幸いです。
Realm公式 マニュアル
Realmの特徴
SwiftとRealmでToDoアプリ開発
Qiita内のRealmの記事
DB操作管理クラスって?
DB操作管理クラスとは、以下の記事と同様にDBの操作をするための管理クラスのことです。
Swiftをもとに説明すると、
各ViewControllerに処理を書いていきますが、同じような処理が別のViewController内にもあった場合、重複して書いてしまうと、ソースコードの量が増え、可読性が下がる恐れがあります。
なので、なるべく同様な処理があり使い回したい場合は、共通かできるように、一つのクラスに列挙して置くのが良いと考えられています。
つまり、共通化クラスを作成した方が、ソースコードの量を抑えられ、処理が追いやすくなります。
DBに特化した共通化クラスを、「DB操作管理クラス」と呼ぶことが可能です。
以降、DB操作管理クラスの作成手順が記載されています。
レシピ
手順① テーブルを定義するファイルを作成する
import Foundation
import Realm
import RealmSwift
class User: Object {
// ここにモデルを記載します。
}
手順② モデルを決めてテーブルを定義する
import Foundation
import Realm
import RealmSwift
class User: Object {
@objc dynamic var id = ""
@objc dynamic var name = ""
@objc dynamic var biography = ""
@objc dynamic var productsNum = 0
// オーバーライドし、プライマリキーにしたい変数名を返す。
override static func primaryKey() -> String? {
return "id"
}
}
手順③ DBの操作を管理するクラス用のファイルを作成する
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
// ここにDBの操作を記載します。
}
手順④ 外部から接続できるようにする
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
/// 外部から操作できるようにします。
static let shared = RealmUtilManager()
}
手順⑤ ローカルDBのパスを参照できるようにする
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
static let shared = RealmUtilManager()
/// ローカルDBのファイルを参照するためのパスを取得します。
public let fileURL = Realm.Configuration.defaultConfiguration.fileURL!
}
手順⑥ テーブルを保存する処理を追加する
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
static let shared = RealmUtilManager()
public let fileURL = Realm.Configuration.defaultConfiguration.fileURL!
/// テーブルを保存するための処理。
public func saveAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.add(model)
print(realm.objects(T.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
}
手順⑦ テーブルを更新する処理を追加する
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
static let shared = RealmUtilManager()
public let fileURL = Realm.Configuration.defaultConfiguration.fileURL!
public func saveAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.add(model)
print(realm.objects(T.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
/// Userテーブルのデータを更新するための処理。
public func updateUserAction(id: String?, name: String?, biography: String?, productsNum: Int?) {
do {
let realm = try Realm()
let user = User()
try! realm.write {
user.id = id!
user.name = name!
user.biography = biography!
user.productsNum = productsNum!
realm.add(user, update: .modified)
print(realm.objects(User.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
}
手順⑧ テーブルを単一削除する処理を追加する
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
static let shared = RealmUtilManager()
public let fileURL = Realm.Configuration.defaultConfiguration.fileURL!
public func saveAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.add(model)
print(realm.objects(T.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
public func updateUserAction(id: String?, name: String?, biography: String?, productsNum: Int?) {
do {
let realm = try Realm()
let user = User()
try! realm.write {
user.id = id!
user.name = name!
user.biography = biography!
user.productsNum = productsNum!
realm.add(user, update: .modified)
print(realm.objects(User.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
/// テーブルを一つだけ削除するための処理。
public func deleteAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.delete(model)
}
} catch {
print(error)
print(error.localizedDescription)
}
}
}
手順⑨ テーブルを全削除する処理を追加する
import Foundation
import Realm
import RealmSwift
class RealmUtilManager {
static let shared = RealmUtilManager()
public let fileURL = Realm.Configuration.defaultConfiguration.fileURL!
public func saveAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.add(model)
print(realm.objects(T.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
public func updateUserAction(id: String?, name: String?, biography: String?, productsNum: Int?) {
do {
let realm = try Realm()
let user = User()
try! realm.write {
user.id = id!
user.name = name!
user.biography = biography!
user.productsNum = productsNum!
realm.add(user, update: .modified)
print(realm.objects(User.self))
}
} catch {
print(error)
print(error.localizedDescription)
}
}
public func deleteAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.delete(model)
}
} catch {
print(error)
print(error.localizedDescription)
}
}
/// テーブルを全削除するための処理。
public func deleteAllAction<T: Object>(model: T) {
do {
let realm = try Realm()
try! realm.write {
realm.deleteAll()
}
} catch {
print(error)
print(error.localizedDescription)
}
}
}
おわりに
今回は、RealmのDB操作管理クラス(= 共通化クラス)を作成しました。
Realmの処理は、よく使うため、処理を一つのクラスに纏めておくことで、使い回しができます。
Realmに慣れてきたら、是非、共通化してみて下さい。