本文小for原创,转载请注明出处。
上一节小for记叙了xml文件保存数据的简单使用方法,并且提到大量的、复杂的数据还是用数据库来保存比较合适。和Android不同的是,Android把SQLite数据库嵌入到系统中,可以直接调用api实现数据库的添删改查或者更复杂的操作,而在Cocos2d-x中我们不能直接使用,后来官方给我们提供了操作SQLite的源码(开源真好)。
首先到http://www.sqlite.org/sqlite-amalgamation-3071000.zip下载我们需要的源码,解压到Cocos2d-x的根目录下,文件夹名为sqlite-amalgamation-3071000,一个四个文件shell.c、shell.h、sqlite3.h、sqlite3ext.h。然后,把这几个源文件放到我们的工程里面。
下面,小for将就创建数据库(文件)、建表、添、删、改、查来记录下SQLite的简单操作。
1、 新建数据库文件
什么都不说了,直接上代码。
sqlite3* pDB=NULL;//数据库指针
char *errMsg=NULL;//错误信息
string sql; //sql语句
int result; //sqlite3_exec返回值
result=sqlite3_open("test.db",&pDB);
if(result!=SQLITE_OK)
{
CCLog("打开/新建数据库失败,错误码%d错误原因%s。",result,errMsg);
}
新建数据库和打开数据库都使用这一段断码,和Android一样,如果文件存在,则打开test.db这个数据库文件,如果这个文件不在,就会创建这样一个数据库文件。
2、 建表
剩下建表和添删改都主要是调用接口执行sql命令。
result=sqlite3_exec(pDB,"create table TableName( ID integer primary key autoincrement, name nvarchar(32), age nvarchar(20))", NULL, NULL, &errMsg );
if( result != SQLITE_OK )
CCLog( "创建表失败,错误码%d ,错误原因%s" , result, errMsg );
这里,小for试了一下,如果在这个表已经存在的情况下,再执行下这句话, 是不会新建表的(其实是意料中的事嘛~)。
3、 添
sql=" insert into TableName( name ) values ( 'I am testing' ) ";
result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg );
if(result != SQLITE_OK )
CCLog( "插入记录失败,错误码:%d ,错误原因:%s " , result, errMsg );
4、 删
sql="delete from TableName where ID=1";
result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg );
if(result != SQLITE_OK )
CCLog( "删除记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg );
5、 改
sql="update TableName set age='21' where ID=1";
result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg );
if(result != SQLITE_OK )
CCLog( "修改记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg );
6、 查
查,稍微要复杂点,而且容易出错,也是最常用的。文中不解释了,将注释都写在代码中。
//接收结果result
char **re;
//接收结果的行和列
int r,c;
//SQlite提供的方法,查询,并接收结果
sqlite3_get_table(pDB,"select name from MyTable_1 where ID=1",&re,&r,&c,NULL);
//打印结果
CCLog("-------------------行=%d,列=%d---------------",r,c);
CCLog("-----------------%s-----------------",re[1]);
这里值得注意的是,最后得到的re这个二维数组就是最后的结果,但是它还包括了属性栏,所以re[0]为name。这里不一定是select name,我们用这个select*也是能实现的,但是要灵活地取得re数组中的值。
如果我们尝试往数据库里面存入中文,也是需要用到上一节中提到的WideByte2UTF8方法,将中文转码,符合要求了再放到数据库中。小for在本文中只记录了最简单也是最常用的几种方法,如果看客有更高的需要,我们一起讨论学习吧!
在Android中,小for会把对数据库的操作封装成DBOpenHelper和DataBaseWork两个类。前者是初始化数据库文件的使用调用的,一般只在安装软件后第一次打开的时候才调用,当数据库被意外删除的时候也会调用。后者是常用的操作类,例如添删改查、建表、获得最大值、筛选内容等,在之后的开发中只需要提供参数调用函数即可。
正文结束,闲聊开始。
没想到小for这么快又更新了吧,呵呵,我也没想到。SQLite的使用对于Cocos2d-x的开发应该算是一个里程碑样的功能,就像小for在学习Android时一样。但是,更明确的是,虽然小for一直在拿Android和Cocos2d-x做类比,但是小for还是深知两者不同的,游戏的开发难度更高,需要学的东西可能更多,数据库的操作这些也不是重点(虽然不可缺少)。小for会努力的!向前进,向前进!