SQLite3を使うよ その2 書き込み
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];
}
}
最後の方はよくわからないけど、書き込めるのでよしとしておきます。