SQLite C言語向けAPI チートシートです。
自分以外の需要があるかどうか不明ですが、頻繁に使うもの、便利そうなものについて逐次メモしていきます。
環境
SQLite:3.8.6
ビルド環境:gcc 4.8.1
必要なもの
本家ダウンロードから、ソースコードもしくはWindows用DLLを落としきて利用できるようにしておいてください。ヘッダファイルはソースコードが入っているzipの中にあります。
参考サイト
本家イントロダクション
本家リファレンス
c/c++でsqliteを使う方法 - ぴょぴょぴょ?-Linuxとかプログラミングの覚え書き-
[「SQLite3」に関するページ - idocsq.net](idocsq.net http://idocsq.net/titles/41)
データベースの基本的な使用方法
とりあえず、これさえおさえておけば使うことはできる!とうわけで、
DBファイルを開いて、データの挿入と抽出をする方法について記します。
DBファイルの開閉
ファイルの開閉は、DBファイル名とDBのアクセス用オブジェクトがあれば行えます。
// DBファイル名
char *fileName = "mySQLiteDB";
// DBオブジェクト
sqlite3 *pDB = NULL;
// DBのオープン
err = sqlite3_open(fileName, &pDB);
if(err != SQLITE_OK){
printf("OPEN ERR! %d\n", err);
/* TODO:エラー処理 */
}
printf("OPEN SUCCESS!\n");
// DBのクローズ
err = sqlite3_close(pDB);
if(err != SQLITE_OK){
printf("CLOSE ERR! %d\n", err);
/* TODO:エラー処理 */
}
printf("CLOSE SUCCESS!\n");
オプションを使用してDBの開閉を行いたい場合は、sqlite3_open_v2を使って行えます。
テーブルの作成と削除
「テーブルの作成にはこれを使ってください!」といえるような関数が用意されていればよいのですが、そんなことはないのでSQL文をベタ打ちで実行していきます。
SQL文を実行する方法は主に2通りありますが、
テーブルの作成や削除のような使いまわさないSQL文は、sqlite3_exec()で実行します。
// テーブルの作成
char *errMsg = NULL;
int err = 0;
err = sqlite3_exec(pDB,
"CREATE TABLE IF NOT EXISTS myTable "
"(id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name CHAR(32) NOT NULL)",
NULL, NULL, &errMsg);
if(err != SQLITE_OK){
printf("%s\n", errMsg);
sqlite3_free(errMsg);
errMsg = NULL;
/* TODO: エラー処理 */
}
printf("CREATE TABLE!\n");
// テーブルの削除
char *errMsg = NULL;
int err = 0;
err = sqlite3_exec(pDB,
"DROP TABLE IF EXISTS myTable",
NULL, NULL, &errMsg);
if(err != SQLITE_OK){
printf("%s\n", errMsg);
sqlite3_free(errMsg);
errMsg = NULL;
/* TODO: エラー処理 */
}
printf("DROP TABLE!\n");
sqlite3_exec()の第3引数はコールバック関数、第4引数はコールバック関数の第1引数となりますが、基本的にNULLで問題ありません。
データの追加と抽出
データの追加と抽出のような使いまわすクエリ実行には、sqlite3_prepare()とsqlite3_step()を使います。これらを実行するにはステートメントオブジェクトが必要になります。
sqlite3_prepareでステートメントオブジェクトを用意して、sqlite3_step()でそれを実行するという順番になります。オブジェクトを使い終わったら、sqlite3_finalize()でステートメントオブジェクトを解放します。
// ステートメントオブジェクト
sqlite3_stmt *pStmt = NULL;
// データの追加
// ステートメントの用意
err = sqlite3_prepare_v2(pDB,
"INSERT INTO myTable (name) VALUES (?)",
128, &pStmt, NULL);
if(err != SQLITE_OK){
/* TODO:エラー処理 */
}else{
int i = 0;
for(i = 0;i < 5;i++){
const char name[32];
snprintf(name, 32, "test%02d", i);
// ?の部分に値を代入
sqlite3_bind_text(pStmt, 1, name, strlen(name), SQLITE_STATIC);
while(SQLITE_DONE != sqlite3_step(pStmt)){}
}
}
// ステートメントの解放
sqlite3_finalize(pStmt);
printf("ADD DATA!\n");
// データの抽出
// ステートメントの用意
err = sqlite3_prepare_v2(pDB,
"SELECT * FROM myTable", 64,
&pStmt, NULL);
if(err != SQLITE_OK){
/* TODO:エラー処理 */
}else{
// データの抽出
while(SQLITE_ROW == (err = sqlite3_step(pStmt)) ){
int id = sqlite3_column_int(pStmt, 0);
const char *name = sqlite3_column_text(pStmt, 1);
printf("id: %d, name: %s\n", id, name);
}
if(err != SQLITE_DONE){
/* TODO: エラー処理 */
}
}
// ステートメントの解放
sqlite3_finalize(pStmt);