cocos2d-x學習筆記17:記錄存儲2:SQLite基本使用

 cocos2d-x學習筆記17:記錄存儲2:SQLite基本使用html


1、安裝與配置
SQLite是使用很是普遍的嵌入式數據庫,它有着0配置,佔用資源少等特色。從大型遊戲《魔獸世界》到android上的不少遊戲和軟件(google提供了一個java語言的綁定。)

在cocos2d-x中,咱們使用它的C語言綁定。
爲了方便和簡化篇幅,咱們直接使用它的源代碼。下載地址:
 
將其解壓到cocos2d-x引擎目錄下,獲得一個「sqlite-amalgamation-3071000」文件夾,裏面有四個源文件。

在VC中新建一個項目,起名叫Save。

而後,右鍵點項目-》屬性-》配置屬性-》C++-》常規-》附加包含目錄
添加剛纔的解壓的源代碼路徑。
 
下一步,右鍵點項目-》添加-》現有項,選擇那四個源代碼文件。而後SQLite就配置好了。

2、初步使用

在HelloworldScene中,添加

  
  
           
  
  
  1. #include "sqlite3.h" 
而後在init函數中編寫代碼

  
  
           
  
  
  1. sqlite3 *pDB = NULL;//數據庫指針 
  2. char * errMsg = NULL;//錯誤信息 
  3. std::string sqlstr;//SQL指令 
  4. int result;//sqlite3_exec返回值 
  5.  
  6. //打開一個數據庫,若是該數據庫不存在,則建立一個數據庫文件 
  7. result = sqlite3_open("save.db", &pDB); 
  8. if( result != SQLITE_OK ) 
  9.       CCLog( "打開數據庫失敗,錯誤碼:%d ,錯誤緣由:%s\n" , result, errMsg ); 
  10.   
  11.  //建立表,設置ID爲主鍵,且自動增長 
  12. result=sqlite3_exec( pDB, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ) " , NULL, NULL, &errMsg ); 
  13. if( result != SQLITE_OK ) 
  14.       CCLog( "建立表失敗,錯誤碼:%d ,錯誤緣由:%s\n" , result, errMsg ); 
  15.  
  16. //插入數據 
  17. sqlstr=" insert into MyTable_1( name ) values ( '克塞' ) "
  18. result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 
  19. if(result != SQLITE_OK ) 
  20.       CCLog( "插入記錄失敗,錯誤碼:%d ,錯誤緣由:%s\n" , result, errMsg ); 
  21.  
  22. //插入數據 
  23. sqlstr=" insert into MyTable_1( name ) values ( '葫蘆娃' ) "
  24. result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 
  25. if(result != SQLITE_OK ) 
  26.       CCLog( "插入記錄失敗,錯誤碼:%d ,錯誤緣由:%s\n" , result, errMsg ); 
  27.  
  28. //插入數據 
  29. sqlstr=" insert into MyTable_1( name ) values ( '擎天柱' ) "
  30. result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 
  31. if(result != SQLITE_OK ) 
  32.       CCLog( "插入記錄失敗,錯誤碼:%d ,錯誤緣由:%s\n" , result, errMsg ); 
  33.  
  34.  //關閉數據庫 
  35. sqlite3_close(pDB); 


而後執行項目,你看不到什麼東西,由於只是操做了數據庫。

3、SQLite數據庫管理工具

SQLite Database Browser是一個用Qt編寫的跨平臺SQLite數據庫管理工具。這個工具的特色是很是簡單易用, 甚至不少人拿這個修改SQLite遊戲存檔。(哈哈哈,關於SQLite加密問題,咱們之後會講。)
這裏附上他的下載地址:

而後,咱們用這個工具,打開項目目錄中Resources目錄下的save.db,就能夠看到剛纔生成的數據庫數據了。
 
一共三個標籤頁,DataBase Structure、Browse Data,Execute SQL……意思一目瞭然,不用多說。是否是很好用啊,哈哈哈。


4、其餘常見SQLite操做舉例

仍是以上面的表舉例,直接給出操做代碼。具體接口解釋能夠參考官方文檔: http://www.sqlite.org/docs.html
爲了突出主要內容,刪掉了一些調試信息。

1)更新記錄
把第三條改爲威震天  
  
  
           
  
  
  1. sqlstr="update MyTable_1 set name='威震天' where ID = 3"
  2.  sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 

2)刪除記錄
把第二條葫蘆娃刪了  
  
  
           
  
  
  1. sqlstr="delete from MyTable_1 where ID = 2"
  2.  sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); 

3)判斷表是否存在
判斷表MyTable_1是否存在,保存在isExisted_中。
  
  
           
  
  
  1. bool isExisted_; 
  2. sqlstr="select count(type) from sqlite_master where type='table' and name='MyTable_1'"
  3. sqlite3_exec( pDB, sqlstr.c_str() , isExisted, &isExisted_, &errMsg ); 

這裏用到了一個回調函數isExisted,他的定義以下
  
  
           
  
  
  1. int isExisted( void * para, int n_column, char ** column_value, char ** column_name ) 
  2.             bool *isExisted_=(bool*)para; 
  3.             *isExisted_=(**column_value)!='0'
  4.             return 0; 

4)判斷記錄是否存在
判斷ID=2的記錄是否存在,保存在isExisted_中。
  
  
           
  
  
  1.  bool isExisted_; 
  2. sqlstr="select count(*) from MyTable_1 where ID = 2"
  3. sqlite3_exec( pDB, sqlstr.c_str() , isExisted, &isExisted_, &errMsg ); 
回調函數isExisted的定義,在3)已給出,再也不贅述。

5)得到記錄條數
得到表MyTable_1的記錄條數,保存在count中。  
  
  
           
  
  
  1. int count; 
  2.  sqlstr="select * from MyTable_1"
  3.  sqlite3_exec( pDB, sqlstr.c_str() , loadRecordCount, &count, &errMsg ); 

這裏用到了一個回調函數loadRecordCount,他的定義以下
  
  
           
  
  
  1. int loadRecordCount( void * para, int n_column, char ** column_value, char ** column_name ) 
  2.             int *count=(int*)para; 
  3.             *count=n_column; 
  4.             return 0; 
 
6)讀取一條記錄
讀取表MyTable_1中ID=3的記錄,並打印
  
  
           
  
  
  1. sqlstr="select * from MyTable_1 where ID=3"
  2. sqlite3_exec( pDB, sqlstr.c_str() , loadRecord, NULL, &errMsg ); 

這裏用到了一個回調函數loadRecord,他的定義以下
  
  
           
  
  
  1. int loadRecord( void * para, int n_column, char ** column_value, char ** column_name ) 
  2.             CCLog("ID=%s,name=%s",column_value[0],column_value[1]); 
  3.             return 0;