こんにちは。
キャスレーコンサルティング IT部の向井厚喜です。

少し前にSwiftで簡単なアプリを作る記事を投稿したのですが、
今回は少しステップアップして、Swiftでデータベース(Realm)を扱ってみようと思います。

前回記事Swiftでおみくじアプリを作ってみた

Realmとは

Realmとは、様々なプラットフォームに対応したモバイルデータベースです。
Realm独自の設計により、他のORマッパーやSQLiteに比べ高速に動作します。
また、学習コストの低さも売りで、比較的簡単に実装できると言われています。

今回は画面に入力したテキストを保存して表示させる簡単なメモアプリを作りました。
それでは早速、導入から実装までを行なっていきたいと思います。

動作環境

    OS : macOS 10.14.2
    Swift : 5.0.1
    Xcode : 10.2.1

目次

1. プロジェクト作成 2. Realmをインストール 3. storyboardで画面作成 4. コード実装

1. プロジェクト作成

Xcodeを起動し、「Create a new Xcode project」を選択します。

「Single View App」を選択し、「Next」を押下します。

今回はプロダクトネームを「TableSample」としました。
次はRealmをインストールしていきます。

2. Realmをインストール

インストールにはいくつか方法がありますが、今回はiOSのライブラリ管理ツールの「CocoaPods」によるインストール方法を紹介します。
(CarthageやDynamic Frameworkを使ってインストールも可能ですが、CocoaPodsが一番簡単です)

CocoaPodsの導入

以下のコマンドを実行し、CocoaPodsをインストールします。

$ sudo gem install cocoapods
$ pod setup

次にpodファイルを作成します。
作成したプロジェクトフォルダ直下に移動し、以下のコマンドを実行します。

$ pod init

podファイルが作成されるので、以下のように編集します。

最後にRealmをインストールします。
以下のコマンドを実行すると、Realmがインストールされます。

$ pod install

以下のように、「TableSample.xcworkspace」が作成されているので、こちらからXcodeを開きます。

3. storyboardで画面作成

storyboardから画面要素を以下のように追加していきます。
LibraryからText Field、Button、Table Viewを追加しました。
※本ブログは「Realmの実装」がメインなので、View Controllerとの接続、Constraintsの設定などの手順説明は割愛させて頂きます。

4. コード実装

最後にソースコードを実装します。
まずはモデルクラスファイルを作成します。Realmはモデルを通じてデータベースにアクセスします。
今回は「Memo」という名前で作成しました。モデルはオブジェクトクラスを継承します。
保存したいデータを以下のように定義しました。

import UIKit
import RealmSwift
import Foundation

class Memo: Object {

    @objc dynamic var memo: String? = nil
       
}

続いて、「ViewController.swift」に以下のように記述します。
Button押下時にText Fieldの入力値をDB登録し、登録値をTable Viewに表示させるという非常にシンプルな内容です。

import UIKit
import RealmSwift

class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource {
    
    
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var table: UITableView!
    

    // モデルクラスを使用し、取得データを格納する変数を作成
    var tableCells: Results<Memo>!
    
    // 初期表示時の処理
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Realmインスタンス取得
        let realm = try! Realm()
        
        // データ全権取得
        self.tableCells = realm.objects(Memo.self)
    }
    

    // ボタン押下時の処理
    @IBAction func submitButton(_ sender: Any) {
        
        // モデルクラスのインスタンスを取得
        let MemoInstance:Memo = Memo()
        
        // テキスト入力値をインスタンスに詰める
        MemoInstance.memo = self.textField.text
        
        // Realmインスタンス取得
        let realm = try! Realm()
        
        // DB登録処理
        try! realm.write {
            realm.add(MemoInstance)
        }
        
        // テーブル再読み込み
        self.table.reloadData()
    }


    // cellの数を指定
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.tableCells.count
    }
    

    // cellに値を設定
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        
        let tmpCell: Memo = self.tableCells[(indexPath as NSIndexPath).row];
        
        cell.textLabel?.text = tmpCell.memo
        
        return cell;
    }
    
}

Realmデータベースへの登録・更新・削除

39行目でDB登録を行なっています。
今回のアプリは登録のみの実装ですが、更新・削除は以下のように記述します。

// データ更新
try! realm.write {
 
    MemoInstance.memo  = "更新内容"

}

// データ削除
try! realm.write {
    realm.delete(MemoInstance)
}

完成

Simulatorを使って動作確認を行います。

おわりに

いかがだったでしょうか。
私は普段JavaやMySQLでのWebアプリ開発を行なっているため、iOSアプリ開発は新鮮に感じました。
Realmは導入が楽で、iOSアプリ開発初心者の私でも簡単に実装することができました。
今回は「使ってみる」ことが目的だったので、簡単な内容となりましたが、
今後はさらに深い部分も学習したいと思います。
以上、最後までお読み頂きありがとうございました。

向井厚喜
IT部 向井厚喜
新卒入社3年目、弁護士事務所様向けのWebアプリケーション開発・保守に従事しております。