読者です 読者をやめる 読者になる 読者になる

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #254】RealmSwiftの導入

Realmとは

データベースの一種。 iOSだけでなく、Android版もある。 速くて、構文が書きやすく、テーブル定義も簡単。

RealmSwiftはそのRealmをSwiftで使うためのライブラリ。

RealmSwiftの導入方法

  • CocoaPodsを使っている場合

Podfile内に下記を追記

use_frameworks!
pod 'Realm', :git => 'https://github.com/realm/realm-cocoa.git', :branch => 'swift-2.0'
pod 'RealmSwift', :git => 'https://github.com/realm/realm-cocoa.git', :branch => 'swift-2.0'

RealmSwiftを使ったアプリサンプル

ToDoアプリを作成する

RealmSwiftでモデル定義

1.クラス作成

ファイルを新規追加し、下記のソースを書く。
ファイルはToDo.swiftという名前で作成した。
f:id:fjswkun:20150913154802p:plain

ソースは下記の通り。
RealmSwiftをインポートすること、Objectクラスのサブクラスにすることを忘れずに!

import RealmSwift

class ToDo: Object{
}

2.プロパティの定義

ToDoの名前、期限、完了フラグを追加。
期限はNSDateを使うので、Foundationクラスをインポートした。

import RealmSwift
import Foundation

class ToDo: Object{
    /// 名前
    dynamic var name = ""
    /// 期限
    dynamic var deadLine = NSDate(timeIntervalSince1970: 0)
    /// 完了フラグ
    dynamic var isComplete = false
}

Realmで作成したモデルを使ってToDoを追加

基本的に下記の内容でデータを追加する

// データ作成
let toDo = ToDo()
toDo.name = "名前"

// Realmに書き込み
do{
    let realm = try Realm()
    try realm.write{
        realm.add(toDo)
    }
}catch{
    print("失敗")
}

1.Storyboardで画面作成

f:id:fjswkun:20150913154826p:plain

2.ViewControllerにソースを追記

import UIKit
import RealmSwift

class ViewController: UIViewController {
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var deadLineLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func addToDo(sender: UIButton) {
        // 入力チェック
        if isValidateInputContents() == false{
            return
        }

        // toDoデータ作成
        let toDo = ToDo()
        toDo.name = nameTextField.text!

        // 永続化
        do{
            let realm = try Realm()
            try realm.write{
                realm.add(toDo)
            }
        }catch{
            print("失敗")
        }
    }

    private func isValidateInputContents() -> Bool{
        // 名前の入力
        if let name = nameTextField.text{
            if name.characters.count == 0{
                return false
            }
        }else{
            return false
        }
        return true
    }
}

Realmからデータを取得

特定のモデルのデータを全て取得する場合、 基本的に下記の内容で取得できる。

do{
    let realm = try Realm()
    let results = realm.objects(ToDo)
}catch{
    print("エラー")
}

1.Storyboardを編集

追加したToDoを一覧表示するテーブルビューとセルを追加 f:id:fjswkun:20150913155943p:plain

2.ソース修正

import UIKit
import RealmSwift

class ViewController: UIViewController {
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var deadLineLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!
    
    var toDoItems:Results<ToDo>?{
        do{
            let realm = try Realm()
            return realm.objects(ToDo)
        }catch{
            print("エラー")
        }
        return nil
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func addToDo(sender: UIButton) {
        // 入力チェック
        if isValidateInputContents() == false{
            return
        }
        
        // toDoデータ作成
        let toDo = ToDo()
        toDo.name = nameTextField.text!
        
        // 永続化
        do{
            let realm = try Realm()
            try realm.write{
                realm.add(toDo)
            }
            nameTextField.text = ""
        }catch{
            print("失敗")
        }
        tableView.reloadData()
    }

    private func isValidateInputContents() -> Bool{
        // 名前の入力
        if let name = nameTextField.text{
            if name.characters.count == 0{
                return false
            }
        }else{
            return false
        }
        return true
    }
}

extension ViewController: UITableViewDataSource{
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return toDoItems?.count ?? 0
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let toDo = toDoItems?[indexPath.row]
        
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! ToDoTableViewCell
        cell.nameLabel.text = toDo?.name
        
        return cell
    }
}

実行結果

f:id:fjswkun:20150913160127p:plain

アプリを落として、再度立ち上げてもToDoが表示され、永続化できていることを確認。



おわりに

サンプルアプリの全ソースはコチラからダウンロード。

参考情報

  1. iOSアプリ開発未経験の人向け
  2. iOSアプリ開発をはじめたとき最初に買った書籍 【アプリ作成未経験の人向け】
    Storyboardを使って画面を作成していく。
    手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
    アプリって、こんな感じで作るんだというのを体験できる。
    Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

    Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift