Realmを使ってTODOアプリを作ってみよう！/ Swift(Realmの使い方、初級編)

![スクリーンショット 2019-02-16 19.13.15.png](https://qiita-image-store.s3.amazonaws.com/0/63060/e5ffba90-9a57-97cc-89ab-1b7c7ad87e13.png)
![realmDark.jpg](https://qiita-image-store.s3.amazonaws.com/0/63060/169a49f8-b7fb-a35a-52d4-e9e947718010.jpeg)



# 🍀まえがき

## ■書いてあること
Realmに挑戦してみたので、簡単なアプリの作り方をメモ
ちなみにRealm=レルムらしい👍


## ■下記の症状に効能があります
- とりあえずサクッとRealm触ってみたい
- とりあえず最低限の実装で基本を理解したい


## ■この記事の特徴
初心者でも内容が分かりやすいようになってます。
**変数は英語で命名するのがセオリーですが、あえて全部日本語にしてます（それでも動きます）**
xcode 10.1 swift 4.2 (2019年2月現在)

## ■主な流れ
- プロジェクトの作成
- cocoapodでrealmを追加
- ストーリーボードの設定
- モデルクラスの作成
- セルクラスの作成
- ViewControllerの実装
- 完成！


# 🛠本編

## ◼️プロジェクトの作成
- とりあえずSingleViewAppを選択
- 今回のプロダクトネームは「TestRealm」にしました
![スクリーンショット 2019-02-16 14.18.25.png](https://qiita-image-store.s3.amazonaws.com/0/63060/9303cb28-1cd4-be49-220c-c67d6ef8b097.png)


## ◼️cocoaPodsでRealmを追加

＊cocoapodの導入方法はこちらを参照
https://qiita.com/pekocalypse/items/b80f6c343355a872dde6

### １：cocoapodを入れるのは超簡単下記のコマンドを入れるだけ

```
<!-- cocoapodsをインストール -->
$ sudo gem install cocoapods

<!-- バージョンを確認 -->
$ pod --version
1.6.0

<!-- ライブラリを引っ張ってくるレポジトリを追加 -->
$ pod setup
Setting up CocoaPods master repo
Setup completed
```

### ２：先ほどのTestRealmプロジェクトフォルダに移動して、CocoaPodsを初期化しPodFileを作成しましょう

```
$ cd ~/TestRealm
$ pod init

```
すると、こんな感じで`Podfile`が作成されます
<img width="180" alt="スクリーンショット 2019-02-16 15.38.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/63060/971daba5-1c90-fcbc-2e44-59e1b642ae91.png">

### 3:作成された`Podfile`を編集しましょう
編集は、viで編集してもエディターで編集してもokです。

```ruby

<!-- 初期状態 -->

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'TestRealm' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for TestRealm

end

<!-- 編集してこんな感じにしましょう -->

target 'TestRealm' do
  use_frameworks!
  pod 'RealmSwift'
end

```

### 4:Realmをインストールします

```
$ pod install
Analyzing dependencies
Downloading dependencies
Installing Realm (3.13.1)
Installing RealmSwift (3.13.1)
Generating Pods project
Integrating client project
```
すると、プロジェクトフォルダにがこのように変化します

<img width="816" alt="スクリーンショット 2019-02-16 15.59.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/63060/f2af238d-17a2-14f0-7ba5-5daaaf14238b.png">

### 5：xcodeでプロジェクトを開き直しましょう

realmを入れた後は、`TestRealm.xcodeproj`ではなく、`TestRealm.xcworkspace`からプロジェクトを開きましょう
<img width="206" alt="スクリーンショット 2019-02-16 16.03.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/63060/8cd3c9ef-252e-1f8b-13ed-9844861dad3c.png">




## ◼️ストーリーボードの設定
- view上部にテキストフィールドを配置します(ReturnKeyを**DONE**にしました)
- テーブルビューとセルを設置します（セルのidentifireは**テストセル**にしました）
- テーブルビューのdatasouceを紐付けました(今回はdelegateはいりません)
- 今回はこの２パーツだけを使用します

![スクリーンショット 2019-02-16 17.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/63060/d043e6fa-7912-d65d-c34b-7c63f2c4ee38.png)

＊この辺の詳細はこちらの記事をご参照ください
👨‍💻[SwiftでTableViewを使ってみよう](https://qiita.com/TD3P/items/cafa8e20029047993025)

## ◼️モデルクラスの作成
- Realmに保存したいデータの項目とデータ型を定義します
- 今回は、TODOの項目名だけを文字列で保存します
- まずはプロジェクトにただのswiftファイルを追加します
- 名前は`TodoModel.swift` にしました
- ファイルを作成後、下記のように内容を編集します
- `import`が大事なので注意です！
- 記入直後は、xcodeから赤い警告が出ますが、一度buildすると消えますのでご安心ください

```TodoModel.swift
import Foundation
import RealmSwift

class TodoModel: Object{
  @objc dynamic var 項目名: String? = nil
}
```


## ◼️ViewControllerの実装
先に完成品です

```ViewController.swift
import UIKit

// ①・・・RealmSwiftをimport
import RealmSwift


class ViewController: UIViewController , UITextFieldDelegate {


  //テキストフィールドとテーブルビューを紐付け
  @IBOutlet weak var テキストフィールド: UITextField!
  @IBOutlet weak var テーブル: UITableView!

  // ②・・・作成したTodoModel型の変数を用意。<TodoModel>という書き方はいわゆるジェネリック
  //Realmから受け取るデータを突っ込む変数を準備
  var アイテムリスト: Results<TodoModel>!



  override func viewDidLoad() {
    super.viewDidLoad()

    // ③・・・Realmをインスタンス化
    // Realmのインスタンスを取得
    let Realmインスタンス1 = try! Realm()

    // ④・・・Realmのfunctionでデータを取得。functionを更に追加することで、フィルターもかけられる
    // Realmデータベースに登録されているデータを全て取得
    // try!はエラーが発生しなかった場合は通常の値が返されるが、エラーの場合はクラッシュ
    self.アイテムリスト = Realmインスタンス1.objects(TodoModel.self)
  }


  // 追加ボタンを押したら発動
  @IBAction func 追加ボタン(_ sender: Any) {

    // モデルクラスをインスタンス化
    let インスタンス化したTodoModel:TodoModel = TodoModel()

    // テキストフィールドの名前を突っ込む
    インスタンス化したTodoModel.項目名 = self.テキストフィールド.text

    // Realmデータベースを取得
    // try!はエラーが発生しなかった場合は通常の値が返されるが、エラーの場合はクラッシュ
    let Realmインスタンス2 = try! Realm()

    // ⑤・・・Realmインスタンスからaddを叩くと、データベースにレコードが追加される
    // テキストフィールドの情報をデータベースに追加
    try! Realmインスタンス2.write {
      Realmインスタンス2.add(インスタンス化したTodoModel)
    }

    // テーブルリストを再読み込み
    self.テーブル.reloadData()
  }


}


extension ViewController: UITableViewDataSource {

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.アイテムリスト.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    // TodoModelクラス型の変数を宣言
    let セル:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "テストセル", for: indexPath)

    // 取得したTodoリストからn番目を変数に代入
    let アイテム: TodoModel = self.アイテムリスト[(indexPath as NSIndexPath).row];

    // 取得した情報をセルに反映
    セル.textLabel?.text = アイテム.項目名

    return セル
  }
}

```
### Point①
- RealmSwiftをインポートしましょう。これをしないとRealmが使えないよ！

### Point②
- 事前に作成したモデルクラスを使って、Realmから取得したデータ一覧を突っ込む変数を用意しよう！

### Point③
- Realmをインスタンス化して、Realmのfunctionを叩けるようにしよう！

### Point④
- `Realmのインスタンス.objects()`でデータの取得ができる！
- 更に条件付き取得などがしたい場合はこちらを参照
- https://realm.io/jp/docs/swift/latest#section-29

### Point⑤
- `write`でトランザクションを開始して、addで項目を追加


# 📱完成！
- 早速buildしてみましょう
- 項目を追加した後に、アプリを終了して、再起動してください
- 再起動時に、追加した項目が表示されていれば、データの永続化が出来ています！

![スクリーンショット 2019-02-16 19.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/63060/87ff5ac9-3787-1d87-4179-0443659b7cd3.png)
![18_25.jpg](https://qiita-image-store.s3.amazonaws.com/0/63060/85a7f9c2-2dd6-3ab6-8f4c-f2c8ed09b4aa.jpeg)


# 🎊🤸‍🎉Congratulations!🎉🤸‍🎊
完成したら、コメントに「ワッフルワッフル」と叫んでください😆✨

📱📱📱サンプルはこちら📱📱📱
https://github.com/TD3P/TestRealm


# 📗参考資料
- Realm日本語ドキュメント
  - https://realm.io/jp/docs/swift/latest/
- CocoaPodsの使い方
  - https://www.ukeyslabo.com/development/iosapplication/how-to-use-cocoapods-for-beginner/
  - https://qiita.com/pekocalypse/items/b80f6c343355a872dde6


# 🌟ご指摘大歓迎🌟
正直、全然理解できてないです。
ここちゃうで！！っていうとこあったら、教えてもらえると嬉しいです！！


# NextStage!

**🎉TODOアプリを作ってみようシリーズ**

📱Swiftで簡単なTODOアプリを作ってみよう
https://qiita.com/TD3P/items/8f474358d1dd789557f3

📱SwiftでTableViewを使ってみよう
https://qiita.com/TD3P/items/cafa8e20029047993025

📱Swiftでカスタムセルを再利用したTODOアプリを作ってみよう
https://qiita.com/TD3P/items/116a2199b1f872ac6471

📱SwiftでCoreDataを使ったTODOアプリを作ってみよう
https://qiita.com/pe-ta/items/89203ccc72d964277818

📱SwiftでRealmを使ったTODOアプリを作ってみよう
https://qiita.com/TD3P/items/616e0dbd364179ca284b

---

📱Flutterで基本のTODOアプリを作ってみよう
https://qiita.com/pe-ta/items/b3b7458059c1fd7efcf0

📱Flutterでページ遷移するTODOアプリを作ってみよう
https://qiita.com/pe-ta/items/e547c4cf460319f5093c

📱Flutter x Firestore で気軽に永続化してオラオラする方法
https://qiita.com/pe-ta/items/ccd49fc396b063a821af