LoginSignup
35
42

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-02

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

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

Realmホームページ

Realm導入方法

1.Realmデータベースを使用するには、Dynamic FrameworkCocoapodsCarthageが必要です。

今回はCocoapodsでの導入方法を紹介させていただきます。
導入するにはターミナルを使用します。
こちらはCocoa podsの公式ホームページになります。

Cocoapodsホームページ

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をターミナルにドラック&ドロップします。

スクリーンショット 2016-09-25 09.19.41.png

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

スクリーンショット 2016-09-25 09.22.52.png

スクリーンショット 2016-09-25 09.23.02.png

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

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

スクリーンショット 2016-09-25 09.38.25.png

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

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

スクリーンショット 2016-09-25 09.37.35.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など様々な型をサポートしているので、こちらを参照してください。
型のチート表

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の参考ページ

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

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

35
42
2

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
35
42