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?

More than 3 years have passed since last update.

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

Posted at

##前回までのあらすじ

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

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

realmの概要は前記事
CocoaPodsでrealmを入れようとして失敗したときに試したこと

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

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

まず、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が使えますが、多用するとアプリのパフォーマンスが

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

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

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

試してみてください。

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?