Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > SQLiteを使いたい。ラッパーを検証してみる。

SQLiteを使いたい。ラッパーを検証してみる。(#2)

前回の記事でSQLiteのラッパのRMDB, SWiftData,SQLite.swiftの検証をトライしまいたが、時間の問題で頓挫してしまいましたので続きです。 。ある程度準備が完了しましたので、それぞれのサンプルを動かしてみてみようと思います。InsertとSelectとインストール感を比較してみます。

前回の記事はこちらからどうぞ

サンプル画像

参考:[iOS] SQLite.swift ライブラリを使いたい! その1 « きんくまデザイン SQLite swift
参考:[iOS8] SwiftData(Swift製SQLiteラッパー)を使ったMVCサンプル
参考:Selection 9: Swift環境からObjective-Cで書かれたCocoaPodsを使用する(SwiftでFMDBを使う)

やってみた(FMDB)

まずFMDBです。InsertとSelectを比較してみます

Insert


   FMDatabase * db = [FMDatabase databaseWithPath:self.dbPath];
    if ([db open]) {
        NSString * sql = @"insert into user (name, password) values(?, ?) ";
        NSString * name = [NSString stringWithFormat:@"tangqiao%d", idx++];
        BOOL res = [db executeUpdate:sql, name, @"boy"];
        if (!res) {
            debugLog(@"error to insert data");
        } else {
            debugLog(@"succ to insert data");
        }
        [db close];
    }
    
    

Select


    FMDatabase * db = [FMDatabase databaseWithPath:self.dbPath];
    if ([db open]) {
        NSString * sql = @"select * from user";
        FMResultSet * rs = [db executeQuery:sql];
        while ([rs next]) {
            int userId = [rs intForColumn:@"id"];
            NSString * name = [rs stringForColumn:@"name"];
            NSString * pass = [rs stringForColumn:@"password"];
            debugLog(@"user id = %d, name = %@, pass = %@", userId, name, pass);
        }
        [db close];
    }
    

NSStringを使ってるのがなんだか気になります。Swift専用じゃないですから仕方ないですね。以下のGitHabのサンプルが使いやすかったので共有です

サンプル画像


参考:tangqiaoboy/FmdbSample

やってみた(SwiftData)

GitHubからデータをDLしてみました。が、サンプルコードがない?Swiftファイルのみだけでしたので、 それを利用したこちらのGitHub からサンプルをダウンロードしてみました。eversense/SwiftData-Example

Insert


        if let err = SD.executeChange("INSERT INTO samples (data) VALUES (?)", withArgs: [data]) {
            //there was an error during the insert, handle it here
        } else {
            //no error, the row was inserted successfully
            let (id, err) = SD.lastInsertedRowID()
            if err != nil {
                //err
            }else{
                //ok
                result = Int(id)
            }
        }
    

Select


        var result = NSMutableArray()
        let (resultSet, err) = SD.executeQuery("SELECT * FROM samples ORDER BY ID DESC")
        let dateFormatter = NSDateFormatter()
        if err != nil {
            
        } else {
            for row in resultSet {
                if let id = row["ID"]?.asInt() {
                    let dataStr = row["data"]?.asString()!
                    dateFormatter.dateFormat = "YYYY/MM/dd HH:mm:ss"
                    let data = dateFormatter.dateFromString(dataStr!)
                    let dic = ["ID":id, "data":data!]
                    result.addObject(dic)
                }
            }
        }
        

FMDBと違ってNSStringはつかっていません。ただQuery実行の戻り値が(result,err)と二つ。 個人的に戻り値は一つの方が好きなので、これがシンプルじゃないなぁと気になりましたが、 追加メインファイルはSwiftData.swift一つだけ、とライトで軽量。いい感じです。

サンプル画像

やってみた(SQLite.swift)

さて、、、このSQLlite.swiftですが、Twitterでつぶやくと開発者の方(stephencelisさん)からいきなりGoogle翻訳された日本語メッセージが! もしヘルプが必要でしたらどうぞといった旨の内容。おおおおぉ、、、感謝ですorz なので検証前はとても印象深くなりました。

サンプル画像

なんだかファイルが大きい?のか処理が遅いような感じなのですが参考記事にあったように、Playground内のドキュメントがなんだか新鮮です。

サンプル画像

Insert

  
            let stmt = db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["betty@icloud.com", "cathy@icloud.com"] {
    stmt.run(email)
}
    

Select


for row in db.prepare("SELECT id, email FROM users") {
    println("id: \(row[0]), email: \(row[1])")
    // id: Optional(2), email: Optional("betty@icloud.com")
    // id: Optional(3), email: Optional("cathy@icloud.com")
}

このクエリを実行するprepareって名前が少し気になるのですが、直感的で良さそうです。しかもプロジェクト自体がオープンソースなFrameworkなので、 prepareって言葉も変更できそう。こちら使い方がすこりトリッキーなのですが、GitHubからダウンロードできるのはframeworkのソースなので、 このソースプロジェクト自体をアプリのプロジェクトに追加する必要があります。

サンプル画像

実装するまでが少しステップが多いのが難点なのかな。

まとめ

どれも良さそうではあったのですが一番「シンプルで使いやすそう」とおもったのはSwiftDataです!

なによりも 実装するまでのステップが少ないこと、追加ファイルが少ないので管理しやすそうなのが要因です。FMDBも良いかなと思いましたが、 やはりObjective-Cの頃の名残が残っているで古い印象、新しいもの好きなのでSwiftData。SQLite.swiftも良いのですが、 オープンなだけに深く理解したい人は勉強になるなと思いましたが、簡易的に使いたかったのでSwiftDataを利用しようと思います。

単純な比較で深くまで検証すると違った魅力もそれぞれ出てくるのかと思いますが、ひとまずこの結果で 本日終了です!

前の記事はこちらからです!

次の記事はこちらからです!

↓こんな記事もありますよ!

アイコン一括作成サービス紹介

アプリのアイコンを作るのは手間で面倒くさい。と、思いながらPhotoshopで一つ一つサイズを変えて作っていたのですが、 簡単につくれるサービスやっぱりありました。Macのスクリプトだったり、Webサービスだったりと揃っていましたので共有します。

メモリの動きとポインタ

Swiftとポインターはあまり縁がないのかなと思っていたのですが、開発を進めていると 時々このUnsafePointerの名前を見ることがあります。本日はこのPointerが何を表しているかを調査してみます。

アップルWatchから親アプリケーションへデータ送信

前回の記事では実機上で親アプリケーションからAppleWatchにイベントを送るのができなかった。 Notificationでできるはずなのですが、動作してくれなかった、、、、、。今回はいったん逆の時計から親アプリへのデータ送信の方法サンプルサイト をQiita様の中の記事でみつけましたので検証してみます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!