Cocos2d-x SQLite专题

转自:http://blog.csdn.net/zhy_cheng/article/details/8634967

 

在cocos2d-x中,简单数据存储,可以使用CCUserDefault,大家可以看看我前一篇博文。至于大量,不规则的数据存储,则使用SQLite数据库。SQLite数据库的使用,请参考我的博文C++操作SQLite数据库,在此博文中,主要讲解怎么样使用C++来操作数据库的。SQLite数据库本来就是使用C语言来编写的,所以cocos2d-x使用SQLite也是得心应手。


其实cocos2d-x操作数据库在windows上的使用我早就解决了,主要是在android平台上的使用了。


先来看看代码怎么写,代码就是王道。


首先是要去SQLite官网下载SQLite的源代码。就是两个文件sqlite3.h和sqlite3.c,我在博文的最后会提供下载的。将这两个文件加入工程。

[cpp]  view plain copy
  1. sqlite3 *pdb=NULL;
  2. std::string path=CCFileUtils::sharedFileUtils()->getWriteablePath()+"save.db3";
  3. std::string sql;
  4. int result;
  5. result=sqlite3_open(path.c_str(),&pdb);
  6. if(result!=SQLITE_OK)
  7. CCLog("open database failed, number%d",result);
[cpp]  view plain copy
  1. sqlite3 *pdb=NULL;  
  2. std::string path=CCFileUtils::sharedFileUtils()->getWriteablePath()+"save.db3";  
  3.   
  4.   
  5. std::string sql;  
  6. int result;  
  7. result=sqlite3_open(path.c_str(),&pdb);  
  8. if(result!=SQLITE_OK)  
  9.     CCLog("open database failed,  number%d",result);  


上面的代码就是创建SQLite数据库文件,注意:一定要提供文件的路径。

[cpp]  view plain copy
  1. result=sqlite3_exec(pdb,"create table student(ID integer primary key autoincrement,name text,sex text)",NULL,NULL,NULL);
  2. if(result!=SQLITE_OK)
  3. CCLog("create table failed");
[cpp]  view plain copy
  1. result=sqlite3_exec(pdb,"create table student(ID integer primary key autoincrement,name text,sex text)",NULL,NULL,NULL);  
  2. if(result!=SQLITE_OK)  
  3.     CCLog("create table failed");  


这是创建表的SQL语句。

[cpp]  view plain copy
  1. sql="insert into student values(1,'zhycheng','male')";
  2. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  3. if(result!=SQLITE_OK)
  4. CCLog("insert data failed!");
  5. sql="insert into student values(2,'liuyali','female')";
  6. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  7. if(result!=SQLITE_OK)
  8. CCLog("insert data failed!");
  9. sql="insert into student values(3,'zhy_cheng','male')";
  10. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);
  11. if(result!=SQLITE_OK)
  12. CCLog("insert data failed!");
[cpp]  view plain copy
  1. sql="insert into student  values(1,'zhycheng','male')";  
  2. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);  
  3. if(result!=SQLITE_OK)  
  4.     CCLog("insert data failed!");  
  5.   
  6.   
  7.   
  8. sql="insert into student  values(2,'liuyali','female')";  
  9. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);  
  10. if(result!=SQLITE_OK)  
  11.     CCLog("insert data failed!");  
  12.   
  13. sql="insert into student  values(3,'zhy_cheng','male')";  
  14. result=sqlite3_exec(pdb,sql.c_str(),NULL,NULL,NULL);  
  15. if(result!=SQLITE_OK)  
  16.     CCLog("insert data failed!");  

插入数据。


[cpp]  view plain copy
  1. sql="delete from student where ID=1";
  2. result=sqlite3_exec(pdb,sql.c_str(), ,NULL,NULL);
  3. if(result!=SQLITE_OK)
  4. CCLog("delete data failed!");
[cpp]  view plain copy
  1. sql="delete from student where ID=1";  
  2. result=sqlite3_exec(pdb,sql.c_str(), ,NULL,NULL);  
  3. if(result!=SQLITE_OK)  
  4.     CCLog("delete data failed!");  

删除数据。

[cpp]  view plain copy
  1. char **re;
  2. int r,c;
  3. sqlite3_get_table(pdb,"select * from student",&re,&r,&c,NULL);
  4. CCLog("row is %d,column is %d",r,c);
  5. CCLabelTTF *liu=CCLabelTTF::create(re[2*c+1],"Arial",24);
  6. liu->setPosition(ccp(200,200));
  7. addChild(liu,1);
  8. CCLog(re[2*c+1]);
  9. sqlite3_free_table(re);
  10. sqlite3_close(pdb);
[cpp]  view plain copy
  1. char **re;  
  2.   
  3. int r,c;  
  4.   
  5. sqlite3_get_table(pdb,"select * from student",&re,&r,&c,NULL);  
  6.   
  7. CCLog("row is %d,column is %d",r,c);  
  8.   
  9. CCLabelTTF *liu=CCLabelTTF::create(re[2*c+1],"Arial",24);  
  10. liu->setPosition(ccp(200,200));  
  11. addChild(liu,1);  
  12. CCLog(re[2*c+1]);  
  13.   
  14.   
  15. sqlite3_free_table(re);  
  16.   
  17. sqlite3_close(pdb);  


查询数据。

这里数据查出后,使用一个文本在屏幕上显示,这是为了在Android手机上看到效果。


最后要注意,在发布到Android手机上的时候一定要修改MK文件,该文件是proj.android/jin/Android.mk。添加对sqlite3.c的编译,改成如下:

[cpp]  view plain copy
  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := game_shared
  4. LOCAL_MODULE_FILENAME := libgame
  5. LOCAL_SRC_FILES := hellocpp/main.cpp \
  6. ../../Classes/AppDelegate.cpp \
  7. ../../Classes/HelloWorldScene.cpp\
  8. ../../Classes/sqlite3.c
  9. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
  10. LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static
  11. include $(BUILD_SHARED_LIBRARY)
  12. $(call import-module,CocosDenshion/android) \
  13. $(call import-module,cocos2dx) \
  14. $(call import-module,extensions)
[cpp]  view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4.   
  5. LOCAL_MODULE := game_shared  
  6.   
  7. LOCAL_MODULE_FILENAME := libgame  
  8.   
  9. LOCAL_SRC_FILES := hellocpp/main.cpp \  
  10.                    ../../Classes/AppDelegate.cpp \  
  11.                    ../../Classes/HelloWorldScene.cpp\  
  12.         ../../Classes/sqlite3.c  
  13.                      
  14. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes                     
  15.   
  16. LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static  
  17.               
  18. include $(BUILD_SHARED_LIBRARY)  
  19.   
  20. $(call import-module,CocosDenshion/android) \  
  21. $(call import-module,cocos2dx) \  
  22. $(call import-module,extensions)  


好了,在我的手机上的运行效果如下:

Cocos2d-x SQLite专题_第1张图片


数据库文件保存的位置是/data/data/com.zhycheng.SQLiteTest/save.db3。


最后提供Android的源代码下载:点击打开链接。

你可能感兴趣的:(Cocos2d-x SQLite专题)