はじめに
タイトルの通り、Realmを用いてデータを扱っていこうという記事です。
文字列の保存をRealmを用いて最も一般的な追加〜削除までを取り扱います。読み取る際のフィルタリングとかは別途記事を書く予定です。
0.0. データベースとかRealmの簡単な説明
簡単に言うと、データベースはデータを一箇所に集約してデータ(情報)を保管・管理できる場所のことです。
以下のようなものをデータベースと言います。
商品名 | 値段 |
---|---|
じゃがいも | ¥100 |
キャベツ | ¥360 |
人参 | ¥90 |
で、Realmはモバイル向けのデータベースのライブラリです。
Realmという超優れ物のライブラリを使うことで簡単にデータベースを作ることができます。
ちなみに、Userdefaultsもありますが、こちらは大きい容量のものを保存するとどんどん重くなってしまうなど、デメリットが多々あるので個人的には断然Realm派です。
1. モデル
色々処理を始める前に、まずはデータを扱うための場所を作ってあげます。
今回は以下のようなモデル(VegetableModel)を作成しました。
idはアップデートの際に使用します。
変数名 | 型 |
---|---|
name | String |
price | Int |
id | String |
import Foundation
import RealmSwift
class VegetableModel: Object {
@objc dynamic var name: String = ""
@objc dynamic var price: Int = 0
@objc dynamic var id: String = UUID().uuidString //updateの際に必要
override static func primaryKey() -> String? {
return "id"
}
}
2. 追加
場所を作ったらまずは追加をします。
realm.write
の中で処理を行うようにしましょう。例えば、realm.add(mode)
の部分をその外に書いてしまうと、追加・更新・アップデートなどの処理はwrite{}の中で行われなきゃいけないよ
とエラーが出て怒られます。
let realm = try! Realm()
@IBAction func tappedSaveButton(_ sender: UIButton) {
let model = VegetableModel()
try! realm.write({
model.name = nameTextField.text!
model.price = Int(priceTextField.text!)!
model.id = UUID().uuidString
realm.add(model)
})
print(model)
}
3. 読み取り
追加ができたら、追加した内容を読み取りましょう。簡単ですね。
var vegetableList: Results<VegetableModel>!
self.vegetableList = realm.objects(VegetableModel.self)
例えば0番目のnameを取得したい場合は
self.vegetableList[0].name
とすれば取得できます。
4. 更新
vegetableListの0番目のnameをcabbage、priceを360にアップデートするコードです。
更新したい対象の項目をidで検索して一致したら更新します。
@IBAction func tappedUpdateButton(_ sender: UIButton) {
try! realm.write({
if let model = realm.object(ofType: VegetableModel.self, forPrimaryKey: vegetableList[0].id) {
model.name = "cabbage"
model.price = 360
}
})
self.vegetableList = realm.objects(VegetableModel.self)
}
5. 削除
vegetableListの0番目を削除するコードです。
削除も更新と同じく、対象の項目をidで検索して一致したら削除します。
@IBAction func tappedDeleteButton(_ sender: UIButton) {
try! realm.write({
if let model = realm.object(ofType: VegetableModel.self, forPrimaryKey: vegetableList[0].id) {
realm.delete(model)
}
})
}
その他
Modelの中身を書き換えると実行した時にエラーが出るので、その際はとりあえずシミュレーターからアプリを削除するのが手っ取り早いです。
実際はマイグレーション処理を行うとこの問題は解決しますが、この記事では一旦置いておきます。
書き加えることが出てきたら随時更新します。