因為項目需要用到資料庫,而且不能依賴具體平台同時還要具有靈活性,所以就想到了SQLite,然後拿到源碼後開始修改使用,這裡為了備忘就簡單記錄一下,下面就是簡單的使用例子,同時也希望能夠幫到一些剛剛接觸SQLite的同學。
- static char*create_settinginfo_table_cmd="create table setting_data(Option,DefaultValue,UsingValue)";
- static char*select_record_by_key="select * from setting_data WHERE %s='%s'";
- static char*insert_record_table_cmd="insert into setting_data values('%s','%s','%s')";
- static char*modify_record_by_key="update setting_data SET %s='%s' WHERE %s='%s'";
- static char*null_string="null";
- static int search_callback_exec0(void*exists,int argc, char ** argv, char ** aszColName)
- {
- if(exists) {
- *((int*)exists)=1;
- }
- return 0;
- }
-
- static int search_callback_exec(void*exists,int argc, char ** argv, char ** aszColName)
- {
- if(exists) {
- *((int*)exists)=1;
- strcpy(SETTING_MANAGER.value_buffer,argv[2]);
- }
- return 0;
- }
-
- static enum SETTING_INFO_STATUS get_option_name_value(char*option_name,char**value)
- {
- int exists=0,ret;
- char*err_msg=NULL;
-
- sprintf(SETTING_MANAGER.cmd_buffer,select_record_by_key,"Option",option_name);
- ret=sqlite3_exec(SETTING_MANAGER.db,SETTING_MANAGER.cmd_buffer,search_callback_exec,(void*)&exists,&err_msg);
- if(ret!=SQLITE_OK) {
- printk("Error:%s\n",err_msg);
- sqlite3_free(err_msg);
- return SETTING_INFO_STATUS_NOT_EXIST;
- }
- if(exists==0) {
- return SETTING_INFO_STATUS_NOT_EXIST;
- }
- *value=SETTING_MANAGER.value_buffer;
- return SETTING_INFO_STATUS_SUCCESS;
- }
簡答的說一下,首先定義增刪改查的字串,然後根據需要格式化,最終產生執行命令字串,最後再調用執行SQL語句的函數,這裡需要傳遞幾個參數,以尋找為例,裡面有一個尋找到結果後回調的函數,如果尋找到結果就回調傳遞進去的函數,這裡需要特別說明一下,每尋找到一條記錄就會回調一次指定的函數,並把結果傳遞過去,結果回呼函數的參數這裡簡單說明一下,第一個參數是調用SQL語句執行函數時指定的給結果回呼函數的一個使用者自訂參數,第二個是一條記錄的欄位數,對應argv和aszColName,比如argv[0]就是目前記錄(可以理解為一行)的第一個欄位值,aszColName[0]就是目前記錄的欄位名,其他的都比較好理解,就不羅嗦了,備忘到此結束。