新版的EasyNVR默認都是使用的sqlite數據庫,sqlite數據庫佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了,並且能夠支持Windows/Linux/Unix等主流的操作系統,同時能夠跟很多程序語言相結合。
爲了防止數據庫內的表重複,導致編譯問題,我們常常需要判斷判斷一個表是否在數據庫中已經存在了,在sqlite3中,提供了一個sqlite3_exec函數,可以通過此函數的使用來判斷一個表是否存在。
sqlite3_exec()的api如下:
int sqlite_exec(sqlite *db, const char *sql, int (*callback)(void *,int,char **,char **), void *, char **errmsg);
用來執行sql語句,查詢的結果返回給回調函數callback。所以可以利用callback的使用來判斷表是否存在。
sqlite_exec的參數說明如下:
db:是用於保存打開的數據庫文件dbname的信息;
sql:要執行命令的語句;
callback:回調函數,用來處理查詢結果,如果不需要回調(比如做insert 或者delete 操作時),可以輸入NULL;
void *:是你所提供的指針,你可以傳遞任何一個指針參數到這裏,這個參數最終會傳到回調函數裏面,如果不需要傳遞指針給回調函數,可以填NULL;
errmsg:返回錯誤信息,注意是指向指針的指針;
返回值:執行成功返回SQLITE_OK,否則返回其他值。
要判斷一個表是否存在,sql語句如下:
"SELECT COUNT(*) FROM sqlite_master where type ='table' and name ='" + strTableName + "'"
那麼回調函數的實現如此
static int callback(void *data, int argc, char **argv, char **azColName)
{
if ( 1 == argc)
{
int iTableExist = atoi(*(argv));
if (data!= NULL)
{
int* ptr= (int*)data;
*ptr= iTableExist;
}
}
return 0;
}
注意:返回值一定要寫,否則下次調用 sqlite3_exec(…) 時會返回 SQLITE_ABORT
回調函數中的data是sqlite3_exec()傳入的參數指針,即sqlite3_exec()中的void* 參數。
通過在回調函數中對data進行賦值操作,可以獲取到sqlite3_exec()的執行結果,即通過賦值的 void* 的參數值來判斷一個表是否存在於此數據庫中。如果*ptr > 0 說明數據庫中存在此表。