0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift】Realmを使ったCRUD(追加・読み取り・更新・削除)処理

Last updated at Posted at 2024-08-28

はじめに

タイトルの通り、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の中身を書き換えると実行した時にエラーが出るので、その際はとりあえずシミュレーターからアプリを削除するのが手っ取り早いです。
実際はマイグレーション処理を行うとこの問題は解決しますが、この記事では一旦置いておきます。

書き加えることが出てきたら随時更新します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?