RTSP協議視頻平臺EasyNVR使用sqlite3如何判斷一個表是否在數據庫中已經存在?

新版的EasyNVR默認都是使用的sqlite數據庫,sqlite數據庫佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了,並且能夠支持Windows/Linux/Unix等主流的操作系統,同時能夠跟很多程序語言相結合。

NVR8.png

爲了防止數據庫內的表重複,導致編譯問題,我們常常需要判斷判斷一個表是否在數據庫中已經存在了,在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 說明數據庫中存在此表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章