SQLite3sqlite3_execとコールバック関数の深い理解



Depth Understanding Sqlite3 Sqlite3_exec



sqlite3のC / C ++インターフェースAPIには、主に3つの重要な機能があります。

1、sqlite3_open(const char* filename, sqlite3 **ppDb) 2、int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ ) 3、sqlite3_close(sqlite3*)

Sqlite3_openとsqlite3_closeはよく理解されており、対応するデータベースを開いたり閉じたりします。 sqlite3_exec関数はsqlite3のAPI関数であり、さまざまな関数を実装できるため、実際のプログラミングにはsqlite3_execを理解する必要があります。 sqlite3_exec関数を詳細に分析してみましょう。



1、sqlite3_exec関数

Sqlite3* : open open database Const char* sql, : sql function statement executed *callback, : callback function corresponding to sql statement Void* data, : pointer argument passed to the callback function Char **errmsq : Error Message

その中でconstchar * sqlは対応するsqlステートメントを表します。Linuxの直下では、シェルを使用することですべてのsqlite関数を実現できますが、CまたはC ++開発プログラムを実行すると、シェルが使用できないことは明らかです。 、したがって、この* Sqlは、後で分析するsqlite関数コマンドに対応する「文字列」です。コールバック関数ポインターコールバックは、* sql関数コマンドに対応するコールバック関数です。 いわゆるコールバック関数とは、* sqlに対応する関数コマンドを先に実行し、その結果をコールバック関数に渡し、その結果に応じてさらにコールバック関数を実行することを意味します。これは、この「コールバック関数」が最も意味があることを意味します。データベーステーブルで有効な情報を取得するのか、それとも他のアクションを取得するのか、コールバック関数を介して必要な関数について話す必要があります。



2、sqlite3_execコールバック関数コールバック

まず、コールバック関数のパラメーターを見てみましょう。

typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char** columnName) Parameters: Para : parameter pointer passed in by sqlite3_exec, or pointer parameter columnCount: How many fields (how many columns) are queried for this record? columnValue : This parameter is a double pointer. The data that is queried is stored here. It is a 1-dimensional array, and each element is a Char* is a field content, so this parameter can be not a single byte, but can be indefinite for a string. The value of the length, represented by a string, ending with ''. columnName : This parameter is a double pointer, the language columnValue is corresponding, indicating the field name of this field, Returns : SQLITE_OK is returned if the result is executed, otherwise other values ​​are returned

この場所にはわかりやすい場所がいくつかあります。 コールバック関数のパラメーターは、sql関数コマンドの実行結果によってさらに処理する必要があります。 パラがよく理解されているところでは、sqlite3_execによって渡されるパラメータです。



columnCount:SQL関数の結果の「フィールド」を示します。 それは「列」の数です、はい、それは「列」の数です。

さらに、特別な注意を払う必要があります。コールバック関数は、過半数で1回実行されるのではなく、n回実行されます。 selectを使用してSQL関数を実行すると、出力は多くの場合複数行になり、次にn行になり、n回のコールバック関数が実行されます。例は次のとおりです。

#include #include #include static int callback(void *data, int argc, char **argv, char **azColName){ int i fprintf(stderr, '%s: ', (const char*)data) for(i=0 i

このデータベースのテーブルの内容は次のとおりです(彼女はここにコピーされています) https://www.runoob.com/sqlite/sqlite-c-cpp.html 例):

'INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) ' 'VALUES (1, 'Paul', 32, 'California', 20000.00 ) ' 'INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) ' 'VALUES (2, 'Allen', 25, 'Texas', 15000.00 ) ' 'INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)' 'VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )' 'INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)' 'VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )'

したがって、実行の結果は次のとおりです。

Opened database successfully Callback function called: ID = 1 NAME = Paul AGE = 32 ADDRESS = California SALARY = 20000.0 Callback function called: ID = 2 NAME = Allen AGE = 25 ADDRESS = Texas SALARY = 15000.0 Callback function called: ID = 3 NAME = Teddy AGE = 23 ADDRESS = Norway SALARY = 20000.0 Callback function called: ID = 4 NAME = Mark AGE = 25 ADDRESS = Rich-Mond SALARY = 65000.0 Operation done successfully

COMPANYからのsqlコマンドの動作select *により、 このコマンドは、テーブル内のすべての情報、合計5つのフィールド(列)、4つの情報(行)を出力するため、このコールバック関数は4回実行されます。このロジックを理解することは、非常に重要です。

そして、コールバック関数の最後の2つのパラメーターは次のとおりです。 ダブルポインタ つまり、ポインタのポインタには2層のポインタが含まれ、内側の層は対応するデータポインタを指し、外側の層はデータポインタ番号を指します。これは「列」インデックスとしても理解できます。これらの2つのポインターを使用して、カスタム関数コードをさらに記述できます。