きままにブログスマートフォン用の表示で見るきままにブログプログラミングを主とした私のメモ帳です。寂しいのでコメントください笑この広告は、90日以上更新していないブログに表示しています。はじめにC++(というかC言語)で利用するために適当なデーターベースを作っておきます。test.dbとしてファイルを保存しました。続いてテーブルを作ります。SQLiteについてはSQLite入門を参考にしました。text)でテーブルを作ります。ところでSQLiteは文を実行するごとに毎回トランザクションを実行します。これだと動作が遅くなるので、手動でトランザクションを実行させ、他のアプリケーションからのデーターベース操作をブロックします。こちらはBEGINコマンドでトランザクションを開始し、すべての操作が終わったらCOMMITコマンドで更新します。SQLite3をコンパイルしてリンクして使ってみました。はじめに今回使うAPIを利用順に提示していきます。*/);こいつはfilenameを指定してデーターベースを開くあるいは作成する関数です。だいたいまずはじめに実行します。sqlite3*型へのポインタを渡して書き換えてインスタンスを生成します。C++なら参照で書きたかったかな。std::tupleとかでもいいですね。code.こいつはSQL文(文字列)を渡してSQLを実際に実行する関数です。この際、sqlite3_openで得られたsqlite3*型のインスタンスを渡す必要があります。その他の引数は次のようになっています。この関数は後に紹介する詳細な関数をすべてセットにしたものです。コマンドを実行するだけならこちらを用いると便利です。*/);callbackはコールバック関数で、それに渡す引数が次のvoid*型です。errmsgはエラーメッセージ出力用ですね。errmsgは省略可能です。その際はNULLを渡します。sqlite3_column_name().コールバック関数の戻り値はint型ですが、0でない数を返すとsqlite3_exec関数は失敗し、SQLITE_ABORTを返します。常に0を返しておけばよいです。コールバック関数の第1引数は先程のパラメータであり、第2引数が列の数、第3引数はsqlite3_column_textで得られるデータ列、第4引数はsqlite3_column_nameで得られるID列となっています。テキストデータでないもの、例えば整数等は文字列に変換されてデータ列に格納されています。sqlite3_prepare_v2sqlite3_execでもSQLは実行できますが、より詳細に実行する場合はこの関数でSQLをバイトコードにコンパイルし、後々処理していきます。v2はversion2のことでversion1もあるのですが新しいプログラムではこちらが推奨されています。*/);dbおよびzSqlは先程と同様です。nByteはSQL文(文字列)の最大サイズを指定しますが、負の数を指定することで適当に処理してくれます。ppStmtはsqlite3_stmt*型へのポインタを指定します。sqlite3_stmt*を宣言し、こいつへのポインタを渡せばOKです。pzTailは文字列zSqlの途中のポインタを指定することができます。すると、そのポインタ以降から実行されます。最初から実行する場合はNULLを指定することができます。sqlite3_bind_intSQL文の中に文字列を入れたい場合、sprintfなどで文字列をいじらなくても簡単に設定する機能があります。こちらがこの関数でint型を埋め込むことができます。1.第2引数はprepareで作ったstmtに対して、プレースホルダーの番号を1オリジンで指定します。後々取得は0オリジンなので注意が必要です。parameter.そして第3引数に数値を入れます。sqlite3_bind_text今度はテキストデータをバインドします。char*,int,void(*)(void*));第3引数以降が変わっています。第3引数はテキストのパラメータです。terminator.第4引数は文字列の扱いの時と同様に負の数を指定すれば自動的に処理してくれます。returns.第5引数は文字列等のリソースの破棄に関する関数ポインタを指定します。今回はSQLITE_TRANSIENTをセットし、SQLが内部でコピーを取り適切に処理させます。statement.stmtを実際に実行します。supported.今回はv2のprepare関数を使っていますが、prepare関数によって挙動が異なるようです。well.具体的には戻り値が格段に増えています。continuing.SQLITE_BUSYはロックされていたりして実行できない場合に返されます。stmtがCOMMITや自明なトランザクション外で起こった場合、再実行します。それ以外であった場合はトランザクションを開始する前までロールバックしなければなりません。state.SQLITE_DONEは完了した場合に返されます。これが返った後に再びstep関数を実行してはいけません。実行する場合はreset関数を実行して初期状態に戻ってから実行します。data.複数の値を返してくる場合、SQLITE_ROWが返ります。これが実行されると行のデータが準備され、行を取得する関数によってデータにアクセスできます。次の行にアクセスするには再びsqlite3_step関数を実行します。sqlite3_step().もしも戻り値がSQLITE_ROWだった場合、次のstep関数を実行する前に次に述べるreset関数を実行しなければなりません。sqlite3_column_intもしもstep関数がSQLITE_ROWを返した場合は行の取得となりますのでそれぞれの列から値を取り出してくる必要があります。そのひとつがこの関数でint型として取得できます。列番号iColを指定することで値を取得できます。列番号は0オリジンであることに注意が必要です。iCol);テキストの取得も列番号を指定するだけです。bindings.この関数はstmtオブジェクトをリセットし再び実行できる状態に戻します。sqlite3_bind_*系のAPIはそれぞれ内部データを別で保持しているのでこれらをクリアするにはsqlite3_clear_bindings関数を使わなければなりません。code.stmtを初期化します。直前のSQLが正常に実行されればSQLITE_OKを返し、そうでなければエラーコードを返します。corruption.リソースリークに繋がるおそれがあるのでSQLite3を利用する際は必ず毎回prepared関数で生成したstmtに対してfinalize関数を実行します。deallocated.最後にデータベースを閉じます。関連するリソースは全て解放されます。ある程度の規模のプログラムを書くと、関数...2015-01-23Optionalを実装せよOptionalは無効値を持った型です。)はてなブログをはじめよう!staryoshiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。