##前回までのあらすじ
前回、realmのインストール・エラー解決法まで進めました。
今回はいよいよrealmをtodoアプリと実際に結びつけていきたいと思います。
realmの概要は前記事
CocoaPodsでrealmを入れようとして失敗したときに試したこと
で説明したので割愛します。
##クラスとそのインスタンスを生成
まず、realmにデータを保存するには、空のクラスが必要になります。
このクラスの中のオブジェクトtextが今回保存される対象になります。
class TextList: Object {
@objc dynamic var text = ""
}
そして、todoアプリでは複数のテキストを管理したいので、realmに保存する
際は以下のようにして定義します。
textList = realm.objects(TextList.self)
TextListをオブジェクトとしてswift上で使えるようにインスタンスを
つくります。
アプリ稼働時はこのtextListの中に保存されたテキストの数に応じて
セルの数が決まります。
realmでデータを保存する
データを使えるようになったので、次は実際に入力したデータをrealmに保存・削除
してみたいと思います。
realmの操作はインストールするときとは違ってとてもシンプル。
realm.writeメソッドの中で目的にあったメソッドを追加することでデータを操作します。
let realm = try! Realm()
try! realm.write {
//○番目のテキストを削除
realm.delete(textList[indexPath.row])
}
let textList: TextList = TextList();
textList.text = input.text!
let realm = try! Realm()
try! realm.write {
//テキストを書き込む
realm.add(textList)
}
realm.addで書き込むときは、textListインスタンスを作ってinput.text!(書き込むテキスト)
を格納します。
##全体コード
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が使えますが、多用するとアプリのパフォーマンスが
悪くなったりキーの入力がめんどくさかったりと少し引っかかる要素もあるので
それならデータベースの中に入れたほうが安定するんじゃない?と若干心変わりしています。
中小規模なアプリならば間違いなく活躍してくれるので、データベース選びに迷っている方は
試してみてください。