sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

SQLite3を使うよ その2 書き込み

その1の続き

PreparedStatement

データベースの用意ができましたので、次は値の読み書きに使えるPreparedStatementを作成します。

AndroidではsqlではなくContentValuesにカラム名とデータをセットしてinsertする方が好きな私ですが、iOSでは勝手が良く分からないのでprepared statementを用意して、値をbindすることにします。

+ (sqlite3_stmt*)prepareStatement:(sqlite3*)database query:(const char*)pSql
{
    sqlite3_stmt* pstmt;
    if(database && sqlite3_prepare_v2(database, pSql, -1, &pstmt, NULL) == SQLITE_OK){
        return pstmt;
    }else{
        return NULL;
    }
}

bind用メソッド

PreparedStatementに値をセットするためのメソッド群を準備します。int,int64,double,char*と、blob用があればバッチリですね。注意する点は、SQLの中の一番左の?のindexが1だということ。忘れないでください。

+ (void)bindInt:(sqlite3_stmt*)pstmt index:(int)index data:(int)data
{
    sqlite3_bind_int(pstmt, index, data);
}

+ (void)bindInt64:(sqlite3_stmt*)pstmt index:(int)index data:(int64_t)data
{
    sqlite3_bind_int64(pstmt, index, data);
}

+ (void)bindDouble:(sqlite3_stmt*)pstmt index:(int)index data:(double)data
{
    sqlite3_bind_double(pstmt, index, data);
}

+ (void)bindText:(sqlite3_stmt*)pstmt index:(int)index data:(const char*)pdata
{
    if(pdata){
        sqlite3_bind_text(pstmt, index, pdata, -1, SQLITE_TRANSIENT);
    }else{
        sqlite3_bind_null(pstmt, index);
    }
}

+ (void)bindBlob:(sqlite3_stmt*)pstmt index:(int)index data:(const void*)pdata length:(int)length
{
    if(pdata && length > 0){
        sqlite3_bind_blob(pstmt, index, pdata, length, SQLITE_TRANSIENT);
    }else{
        sqlite3_bind_null(pstmt, index);
    }
}

書き込み実行

わざわざメソッドにすることも無いのですが、手軽に書き込みたいために用意

+ (BOOL)execute:(sqlite3_stmt*)pstmt
{
    return (sqlite3_step(pstmt) == SQLITE_DONE);
}

Statement close

Statementをfinalizeします。作ったStatementはfinalizeしないといけないらしいです。

+ (void)finalizeStatement:(sqlite3_stmt*)pstmt
{
    sqlite3_finalize(pstmt);
}

書き込み例

かなりざっくりとはしょりますが、こんな感じで書き込みます。bindの所でも書きましたが、最初の?はindexを1としてbindします。

sqlite3_stmt* pstmt = [TFDBTool prepareStatement:_database query:"insert into mytable (id) values (?)"];
if(pstmt){
    // データバインド
    [TFDBTool bindInt:pstmt index:1 data:123];

    if([TFDBTool execute:pstmt]){
        [TFDBTool finalizeStatement:pstmt];
    }
}

最後の方はよくわからないけど、書き込めるのでよしとしておきます。

その3へ続く