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;