↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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を利用しようと思います。

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

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

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

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


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!