RealmSwiftを使ってデータの書き出し・削除の操作を行う


##前回までのあらすじ

前回、realmのインストール・エラー解決法まで進めました。

今回はいよいよrealmをtodoアプリと実際に結びつけていきたいと思います。

realmの概要は前記事
[CocoaPodsでrealmを入れようとして失敗したときに試したこと](https://qiita.com/cherry0910/items/cd29e2a27119b66a65d6)

で説明したので割愛します。

##クラスとそのインスタンスを生成

まず、realmにデータを保存するには、空のクラスが必要になります。

このクラスの中のオブジェクトtextが今回保存される対象になります。

```viewController.swift
class TextList: Object {
  @objc dynamic var text = ""
}
```
そして、todoアプリでは複数のテキストを管理したいので、realmに保存する

際は以下のようにして定義します。

```viewController.swift
textList = realm.objects(TextList.self)
```

TextListをオブジェクトとしてswift上で使えるようにインスタンスを
つくります。

アプリ稼働時はこのtextListの中に保存されたテキストの数に応じて
セルの数が決まります。

## realmでデータを保存する

データを使えるようになったので、次は実際に入力したデータをrealmに保存・削除
してみたいと思います。

realmの操作はインストールするときとは違ってとてもシンプル。

realm.writeメソッドの中で目的にあったメソッドを追加することでデータを操作します。

```viewController.swift
let realm = try! Realm()
try! realm.write {
  //○番目のテキストを削除
  realm.delete(textList[indexPath.row])
}
```

```viewController.swift
let textList: TextList = TextList();
textList.text = input.text!
let realm = try! Realm()
try! realm.write {
  //テキストを書き込む
  realm.add(textList)
}
```

realm.addで書き込むときは、textListインスタンスを作ってinput.text!(書き込むテキスト)

を格納します。

##全体コード
```viewController.swift
import UIKit
import RealmSwift

class TextList: Object {
  @objc dynamic var text = ""
}

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet weak var input: UITextField!
    
    @IBOutlet weak var tableCell: UITableView!
    
    //一番最初にTextListの中身を受け取る
    var textList : Results<TextList>!
    
    override func viewDidLoad() {
        let realm = try! Realm()
        super.viewDidLoad()
        textList = realm.objects(TextList.self)
    }
    // TableViewに表示するセルの数を返却。
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return textList.count
        }

        // 各セルを生成して返却します。
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableCell.dequeueReusableCell(withIdentifier: "tableCell",
                                                         for: indexPath)
            cell.textLabel?.text = "\(textList[indexPath.row].text)"
            return cell
        }
        func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
          return true
        }
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            if editingStyle == UITableViewCell.EditingStyle.delete {
              let realm = try! Realm()
              try! realm.write {
                realm.delete(textList[indexPath.row])
              }
              tableCell.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
            }
        }
        // ボタン押下時のアクション
        @IBAction func pushButton(_ sender: UIButton) {

            let textList: TextList = TextList();
            textList.text = input.text!
            let realm = try! Realm()
            try! realm.write {
              realm.add(textList)
            }
            tableCell.reloadData()
            input.text = ""
        }
}


```

##まとめ

Resultsオブジェクトは配列とは違うところが少しわかりにくいですが、基本的な

操作はこのtodoアプリの全体コードを見ていただければ理解できると思います。

swift以外にもandroidやjavascriptでも使うことができます(万能！)

javascriptではlocalStorageが使えますが、多用するとアプリのパフォーマンスが

悪くなったりキーの入力がめんどくさかったりと少し引っかかる要素もあるので

それならデータベースの中に入れたほうが安定するんじゃない？と若干心変わりしています。

中小規模なアプリならば間違いなく活躍してくれるので、データベース選びに迷っている方は

試してみてください。