【Cocos2d-x】集成wxSqlite3到Cocos2d-x

前端之家收集整理的这篇文章主要介绍了【Cocos2d-x】集成wxSqlite3到Cocos2d-x前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


关于wxsqlite3


wxsqlite3是一个轻量级的开源数据库项目,基于sqlite3,相比sqlite3增加数据库加密功能,是用C语言实现的,跨平台。


下载wxsqlite3


下载地址:https://github.com/utelle/wxsqlite3


集成wxsqlite3到Cocos2d-x


1.在cocos2d-x引擎external目录下新建wxsqlite3\src目录


2.把wxsqlite3-3.1.1\sqlite3\secure\src目录下的.h和.c文件拷贝到wxsqlite3/src目录下



3.添加sqltesecure.c到libLocalStorage项目中。(Cocos2d-x2.x是添加到libExtensions项目)



4.设置预编译宏:sqlITE_HAS_CODEC,该宏用于开启加密功能



5.相关api


(1). 设置密码(在sqlite3_open和sqlite3_close之间任何地方使用)

int sqlite3_key(
sqlite3 *db,//数据库引用
const void *pKey,//密码
int nKey //密码长度
);


(2).修改密码(在sqlite3_open和sqlite3_close之间任何地方使用)

int sqlite3_rekey(
sqlite3 *db,//新密码
int nKey //密码长度
);


示例:在LocalStorage.cpp中的localStorageInit方法中初始化数据库时设置密码

  1. voidlocalStorageInit(constchar*fullpath)
  2. {
  3. if(!_initialized){
  4. intret=0;
  5. if(!fullpath)
  6. ret=sqlite3_open(":memory:",&_db);
  7. else
  8. ret=sqlite3_open(fullpath,&_db);
  9. //设置密码
  10. #if(CC_TARGET_PLATFORM!=CC_PLATFORM_WIN32)
  11. sqlite3_key(_db,"test",4);
  12. #endif
  13. localStorageCreateTable();
  14. //SELECT
  15. char*sql_select="SELECTvalueFROMdataWHEREkey=?;";
  16. ret|=sqlite3_prepare_v2(_db,sql_select,-1,&_stmt_select,NULL);
  17. //REPLACE
  18. char*sql_update="REPLACEINTOdata(key,value)VALUES(?,?);";
  19. //DELETE
  20. char*sql_remove="DELETEFROMdataWHEREkey=?;";
  21. if(ret!=sqlITE_OK){
  22. printf("ErrorinitializingDB\n");
  23. //reporterror
  24. }
  25. _initialized=1;
  26. }
  27. }
  28. @H_828_301@


测试工程svn地址:http://code.taobao.org/svn/wxsqlite3_cocos2dx/trunk


编译到Android


1.在external\wxsqlite目录下添加Android.mk文件文件内容如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
            
LOCAL_PATH := $(call my-dir )
#清理变量定义
include $(CLEAR_VARS)
#模块名称
LOCAL_MODULE := wxsqlite3_static
LOCAL_MODULE_FILENAME := libwxsqlite3
#定义预编译宏
LOCAL_CFLAGS += -DsqlITE_HAS_CODEC ##该宏用于开启加密功能
#源文件
LOCAL_SRC_FILES := src/sqlite3secure.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH )/src
#头文件目录
LOCAL_C_INCLUDES := )/src
#构建静态库
include $(BUILD_STATIC_LIBRARY)
@L_404_36@
Android.mk


2.工程中引入wxsqlite3静态库

cocos2d-x3.x修改cocos2d\cocos\storage\local-storage目录下的Android.mk文件如下

[plain] copy
    LOCAL_PATH:=$(callmy-dir)
  1. include$(CLEAR_VARS)
  2. LOCAL_MODULE:=cocos_localstorage_static
  3. LOCAL_MODULE_FILENAME:=liblocalstorage
  4. LOCAL_SRC_FILES:=LocalStorage.cpp
  5. LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/..
  6. LOCAL_C_INCLUDES:=$(LOCAL_PATH)/../..
  7. LOCAL_CFLAGS+=-Wno-psabi
  8. LOCAL_CFLAGS+=-DsqlITE_HAS_CODEC##该宏用于开启加密功能
  9. LOCAL_EXPORT_CFLAGS+=-Wno-psabi
  10. LOCAL_WHOLE_STATIC_LIBRARIES:=cocos2dx_static
  11. LOCAL_WHOLE_STATIC_LIBRARIES+=wxsqlite3_static#引入静态库
  12. include$(BUILD_STATIC_LIBRARY)
  13. $(callimport-module,.)
  14. $(callimport-module,external/wxsqlite3)#引入模块
  15. @H_828_301@

cocos2d-x2.x修改cocos2d-x-2.x\extensions目录下的Android.mk文件如下,直接把加密功能增加到引擎扩展库

LOCAL_MODULE:=cocos_extension_static
  • LOCAL_MODULE_FILENAME:=libextension
  • LOCAL_SRC_FILES:=AssetsManager/AssetsManager.cpp\
  • ##太长,这里就省略了源文件的导入##
  • LOCAL_WHOLE_STATIC_LIBRARIES+=cocosdenshion_static
  • LOCAL_WHOLE_STATIC_LIBRARIES+=cocos_curl_static
  • LOCAL_WHOLE_STATIC_LIBRARIES+=Box2d_static
  • LOCAL_WHOLE_STATIC_LIBRARIES+=chipmunk_static
  • LOCAL_WHOLE_STATIC_LIBRARIES+=libwebsockets_static
  • LOCAL_WHOLE_STATIC_LIBRARIES+=wxsqlite3_static##引入静态库
  • LOCAL_CFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  • LOCAL_EXPORT_CFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  • LOCAL_CPPFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  • LOCAL_EXPORT_CPPFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  • LOCAL_CFLAGS:=-fexceptions
  • LOCAL_CFLAGS+=-DsqlITE_HAS_CODEC##该宏用于开启加密功能
  • LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)\
  • $(LOCAL_PATH)/CCBReader\
  • $(LOCAL_PATH)/GUI/CCControlExtension\
  • $(LOCAL_PATH)/GUI/CCScrollView\
  • $(LOCAL_PATH)/network\
  • $(LOCAL_PATH)/LocalStorage\
  • $(LOCAL_PATH)/CCArmature
  • LOCAL_C_INCLUDES:=$(LOCAL_PATH)/../scripting/lua/cocos2dx_support\
  • $(LOCAL_PATH)/../scripting/lua/lua
  • include$(BUILD_STATIC_LIBRARY)
  • Box2D)
  • sqlite3)##引入模块
  • @H_828_301@


    3.Cocos2d-x引擎在Android平台下默认是通过Jni调用android sdk自带sqliteOpenHelper和sqliteDatabase去创建和操作数据库的,所以在Android下使用wxsqlite3,需要进行以下几个步骤:

    (1).注释LocalStorage.cpp中对于安卓平台的判断宏



    (2).修改Android.mk:Cocos2d-x对Android平台下数据库的操作封装在LocalStorageAndroid.cpp,现在修改为使用LocalStorage.cpp,使用跨平台的wxsqlite3


    Cocos2d-x3.0:修改cocos2d\cocos\storage\local-storage目录下的Android.mk,删除LOCAL_SRC_FILES字段中的LocalStorageAndroid.cpp

    Cocos2d-x2.0:修改cocos2d-x-2.x\extensions目录下的Android.mk,修改LOCAL_SRC_FILES字段中LocalStorageAndroid.cpp为LocalStorage.cpp


    现在编译工程,就可以了。生成数据库文件应该在/data/data/包名/files目录下,如果加密成功了,使用sqlite查看器打开应该会失败。


    编译到IOS


    1.打开iOS工程,右键Add File,添加wxsqlite3文件夹到工程。


    只保留sqlite3.h和sqlite3secure.c的引用即可。



    2.点击工程——Build Settings——设置预编译宏(sqlITE_HAS_CODEC),开启加密功能


    3.编译成功!


    (原文地址:http://blog.csdn.net/linchaolong/article/details/41286297)


    API使用说明:

    sqlite3_key是输入密钥,如果数据库已加密必须先执行此函数并输入正确密钥才能进行操作,如果数据库没有加密,执行此函数后进行数据库操作反而会出现“此数据库已加密或不是一个数据库文件”的错误

    int sqlite3_key( sqlite3 *db,const void *pKey,int nKey),db 是指定数据库,pKey 是密钥,nKey 是密钥长度。例:sqlite3_key( db,"abc",3);

    sqlite3_rekey是变更密钥或给没有加密的数据库添加密钥或清空密钥,变更密钥或清空密钥前必须先正确执行 sqlite3_key。在正确执行 sqlite3_rekey 之后在 sqlite3_close 关闭数据库之前可以正常操作数据库,不需要再执行 sqlite3_key。

    int sqlite3_rekey( sqlite3 *db,int nKey),参数同上。

    清空密钥为 sqlite3_rekey( db,NULL,0)。

    猜你在找的Cocos2d-x相关文章