HOME > SQLiteを使いたい。ラッパーを検証してみる。
前回の記事で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です。InsertとSelectを比較してみます
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];
}
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のサンプルが使いやすかったので共有です
GitHubからデータをDLしてみました。が、サンプルコードがない?Swiftファイルのみだけでしたので、 それを利用したこちらのGitHub からサンプルをダウンロードしてみました。eversense/SwiftData-Example
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)
}
}
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一つだけ、とライトで軽量。いい感じです。
さて、、、このSQLlite.swiftですが、Twitterでつぶやくと開発者の方(stephencelisさん)からいきなりGoogle翻訳された日本語メッセージが! もしヘルプが必要でしたらどうぞといった旨の内容。おおおおぉ、、、感謝ですorz なので検証前はとても印象深くなりました。
なんだかファイルが大きい?のか処理が遅いような感じなのですが参考記事にあったように、Playground内のドキュメントがなんだか新鮮です。
let stmt = db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["betty@icloud.com", "cathy@icloud.com"] {
stmt.run(email)
}
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... |
Tweet | |||
|