Swift3.0 Realmデータベースを使う　

こんにちは😀　フリーランス　エンジニアの永田大祐と申します。
初投稿させていただきます。
宜しければ、ストックしていただくとありがたいです。

今回は、文字列,数字,データなどを保存,運用できるiosのデータベースのRealmをSwift3.0でRealmデータベースの使用方法を、導入も含めて投稿させていただきます。*ベストプラクティスではないかもしれませんが、そこはご了承願います。
Realmの公式ホームページはこちらになります。
#####[Realmホームページ](https://realm.io/jp/docs/swift/latest/)

#Realm導入方法
####1.Realmデータベースを使用するには、`Dynamic Framework`か`Cocoapods`か`Carthage`が必要です。

今回はCocoapodsでの導入方法を紹介させていただきます。
導入するにはターミナルを使用します。
こちらはCocoa podsの公式ホームページになります。
#####[Cocoapodsホームページ](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjgt4q8mqnPAhXFmpQKHTOPDGoQFgghMAA&url=https%3A%2F%2Fcocoapods.org%2F&usg=AFQjCNGxz1cVaIp-FQOEIg2wW8S4oM9a_w&sig2=ucK4wLnlu3qxP6zTUMpgQQ)

Finderでターミナルと検索すると、表示できると思います。
ターミナルでコマンド操作をして、Realmのライブラリーを自分のXcodeプロジェクトに導入します。

####2.Cocoa podsのインストール、バージョン指定。
バージョンの確認方法 

    pod --version

バージョン指定してCocoapodsのインストール方法

    sudo gem install -v 1.0.1 cocoapods


バージョン指定してCocoapodsのアンインストール方法

    sudo gem uninstall cocoapods --version '=1.0.1'

######*今回はversion1.0.1の環境で実施します。


####3.pod fileの作成
Xcodeプロジェクト内でpod fileを作成します。
今回は、ターミナル操作での紹介をさせていただきます。

cdと入力することによりプロジェクトのディレクトリ指定できます。
cdと入力後、Xcodeプロジェクトfileをターミナルにドラック&ドロップします。

<img width="573" alt="スクリーンショット 2016-09-25 09.19.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/159fb8c3-257d-7669-3d01-10d9bd281484.png">



pod init と入力することにより、pod fileが作成できます。


<img width="569" alt="スクリーンショット 2016-09-25 09.22.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/d8a2e61f-1aa7-38fd-f487-ae4986b625bb.png">

<img width="207" alt="スクリーンショット 2016-09-25 09.23.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/b499753a-8f0e-f7ef-928b-90e11311ab9a.png">


vim pod fileと入力すると、ターミナル内でpod file が開きます。
iosバージョンによりpod fileの内容も、書き方も変わります。

pod fileに pod 'RealmSwift'と入力します。

<img width="570" alt="スクリーンショット 2016-09-25 09.38.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/410b1d60-9a5a-a874-9dba-cf5f208e134c.png">

Macの一番左上のボタンescボタンを入力して編集モードは終了します。
:wqと入力して、ターミナル内でpodfileを閉じます。

pod installと入力するとRealmライブラリーがXcodeプロジェクト内に導入されます。
ここでエラーが出る場合は、
podインストールがうまくいってない。
入力ミスなどがあるので、ターミナルの表示文をよく見ると良いと思います。

<img width="570" alt="スクリーンショット 2016-09-25 09.37.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/131469/1f54c7a0-c949-e94e-be7f-46d1af8af096.png">

これでXcode内にRealmライブラリーを導入できました。

#Xcode内でのRealm導入方法

こちらは手順はシンプルです。

Xcode内で


    import　RealmSwiftと記述します。

#Realmを使う

今回はUITableViewControllerを使用します。

####実施すること

1.Realmのobject(class)の作成

2.Realmを宣言して運用

3.Realmの書き込み（保存）、削除

4.Realmデータのソート

5.Realmを使用したサンプルアプリの紹介

サンプルをモデルに紹介していきます。


##1.Realmのobject(class)の作成
Realm objectを使用するにはclassを作成します。


    class realmDataSet: Object {
    
    dynamic var now = NSDate()
    dynamic var ID = String()
    dynamic var Message = String()
    dynamic var Message2 = String()

    }

ここで変数の型を決定します。IntやDoubleなど様々な型をサポートしているので、こちらを参照してください。
[型のチート表](https://realm.io/jp/docs/swift/latest/#section-10)


##2.Realmの構造体を作り運用
プロジェクトの全体的に使用したい場合は、グローバルで宣言。
共通化するクラスを作っておくとパターンも良いと思います。

    struct RealmModel {

    struct realm{
        
        static var realmTry  = try!Realm()
        static var realmsset = realmDataSet()
        static var usersSet  =　RealmModel.realm.realmTry.objects(realmDataSet.self)

        }
    }


####⬆︎この方法で他クラスからも参照できます。






##3.Realmの書き込み（保存）、(削除)、(監視)

Realmファイルへ書き込み(保存)、(削除)、(監視)
Realmファイルを開き、
Realmデータベースの実装を管理するクラスです。

	func RealmNOtification(views:ViewController){
        RealmThread(views:views)
    }
    
    func RealmAdd(text:String,Index:IndexPath,now:NSDate){
        try!RealmModel.realm.realmTry.write {
        RealmModel.realm.usersSet[Index.row].ID = text
        }
    }

    func RealmCreate(now:NSDate,text:String,text2:String){
        try!RealmModel.realm.realmTry.write {
            RealmModel.realm.realmTry.create(realmDataSet.self,value: [now,text,text2] as [Any])
        }
    }
    
    func RealmthreadLabel(text:String,Index:Int){
        try!RealmModel.realm.realmTry.write {
            RealmModel.realm.usersSet[Index].ID = text
        }
    }
    
    func RealmDeleate(indexPath: IndexPath){
        try!RealmModel.realm.realmTry.write {
            RealmModel.realm.realmTry.delete(RealmModel.realm.usersSet[indexPath.row])
        }
    }
##4.Realmデータのソート
文字列検索にNsPridecateの構文を使用しています。Rxメソッドで実施しています。
[NSPreidcateの参考ページ] (https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&sqi=2&ved=0ahUKEwia-rnBnbvPAhWGFpQKHSV1AFsQFggqMAI&url=https%3A%2F%2Frealm.io%2Fnews%2Fnspredicate-cheatsheet%2F&usg=AFQjCNFeu3HjTtqJVN7B1fxcKXjWiOBZhg&bvm=bv.134495766,d.dGo)


    
    func rxSearchBar(search:UISearchBar,text:String?,table:UITableView?){
            search
            .rx.text.orEmpty
            .subscribe(onNext: { [unowned search] query in
                if  search.text !=  "" {
                    //indexの値を渡す
                    RealmModel.realm.usersSet = RealmModel.realm.realmTry.objects(realmDataSet.self)
                        .filter("Message BEGINSWITH %@",  search.text!)
                        .sorted(byKeyPath: "Message", ascending: false)
                    
                }else if  search.text! == ""{
                    
                    RealmModel.realm.usersSet = RealmModel.realm.realmTry.objects(realmDataSet.self)
                        .sorted(byKeyPath: "now", ascending: false)
                }
                table?.reloadData()
            })
            .addDisposableTo(dis)
    }
 


データを降順や昇順、逆順でソートする方法もあります。

降順

	var users =  realm.objects(realmDataSet.self)
                     .sorted(byProperty: "ID", ascending: false)

昇順

	var users =  realm.objects(realmDataSet.self)
                     .sorted(byProperty: "ID", ascending: true)

今回は入力順で表示するため、プロパティに現在時刻を取得するNSDate()を
新たに追加しました。

	dynamic var now = NSDate()
	dynamic var ID = String()
	
＊realmクラスのプロパティの名前変更、追加、削除は一度アプリを起動すると、例外が起きて、クラッシュします。そのような場合は、一度アプリをアンインストーしてください。リリースしてしまった場合などは、今後お伝えするマイグレーション機能で対応します。




##5. Realmを使用したサンプルアプリの紹介

動画もあります。
https://github.com/daisukenagata/RealmSample_Swift3.0/tree/master


##まとめ

Swift3.0でのRealmファイル最適化
アップデートに伴うマイグレーション
マルチスレッド
Realm mobile Pratform

こちらの詳細も記載していきます。今後ともよろしくお願いします。
貴重な時間を割き、お読み下さいましてありがとうございました。😀