sqlite3 讀取表資料
阿新 • • 發佈:2019-02-13
先上一段 sample
#include <stdio.h> #include <string.h> #include "sqlite3.h" int main() { sqlite3 *db; char *zErrMsg = 0; int rc; char **result; int row, column; int i, j; rc = sqlite3_open("gt_db.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return -1; } rc = sqlite3_get_table(db, "SELECT * FROM DeviceMap", &result, &row, &column, &zErrMsg); if (rc == SQLITE_OK) { printf("row = %d, column = %d\n", row, column); printf(result[0]); for (i = 0; i <= row; i++) { printf("----------- %d -------------\n", i); for (j = 0; j < column; j++) { printf("%s ", result[i*column + j]); } } } sqlite3_free_table(result); sqlite3_close(db); return 0; }
其實,讀取表資料只要用 sqlite3_get_table 就可以了,當然,也可以用 sqlite3_exec 然後在回撥裡查。
官方的說明,講了一大堆,還舉了例項,就怕你看不懂,結果還真是越講越糊塗了。
SQLITE_API int sqlite3_get_table( sqlite3 *db, /* An open database */ const char *zSql, /* SQL to be evaluated */ char ***pazResult, /* Results of the query */ int *pnRow, /* Number of result rows written here */ int *pnColumn, /* Number of result columns written here */ char **pzErrmsg /* Error msg written here */ );
其實是要注意結構就明白了,舉個例子
Name | Age
-----------------------
Alice | 43
Bob | 28
Cindy | 21
這個資料表裡,有兩個欄位 Name 和 Age, 那在一段記憶體裡怎麼表示呢?
其實就是用二維陣列。
pnRow --- 表示有幾條記錄;
pnColumn -- 表示有幾個內容,即有幾個欄位;
那在上面這個示例中
pnRow = 3, pnColumn = 2
如果我要取 Bob 這個人的記錄,則
(*pazResult)[pnColumn * 2 + 0] 取出名字 bob
(*pazResult)[pnColumn * 2 + 1] 取出年齡
這樣會不會比 sqlite3_exec 方便呢?
當然,查完之後,要用 sqlite3_free_table(result); 釋放掉佔用的記憶體