加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 17:14:55 所属栏目:百科 来源:网络整理
导读:关于wxSqlite3 wxSqlite3是一个轻量级的开源数据库项目,基于sqlite3,相比sqlite3增加了数据库加密功能,是用C语言实现的,跨平台。 下载wxsqlite3 下载地址:https://github.com/utelle/wxsqlite3 集成wxsqlite3到Cocos2d-x 1.在cocos2d-x引擎external目录


关于wxSqlite3


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


下载wxsqlite3


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


集成wxsqlite3到Cocos2d-x


1.在cocos2d-x引擎external目录下新建wxsqlite3src目录


2.把wxsqlite3-3.1.1sqlite3securesrc目录下的.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方法中初始化数据库时设置密码

[cpp] view plain copy
  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("ErrorinitializingDBn");
  23. //reporterror
  24. }
  25. _initialized=1;
  26. }
  27. }


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


编译到Android


1.在externalwxsqlite目录下添加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)
来自CODE的代码片
Android.mk


2.工程中引入wxsqlite3静态库

cocos2d-x3.x:修改cocos2dcocosstoragelocal-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)#引入模块

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

copy
    LOCAL_MODULE:=cocos_extension_static
  1. LOCAL_MODULE_FILENAME:=libextension
  2. LOCAL_SRC_FILES:=AssetsManager/AssetsManager.cpp
  3. ##太长,这里就省略了源文件的导入##
  4. LOCAL_WHOLE_STATIC_LIBRARIES+=cocosdenshion_static
  5. LOCAL_WHOLE_STATIC_LIBRARIES+=cocos_curl_static
  6. LOCAL_WHOLE_STATIC_LIBRARIES+=box2d_static
  7. LOCAL_WHOLE_STATIC_LIBRARIES+=chipmunk_static
  8. LOCAL_WHOLE_STATIC_LIBRARIES+=libwebsockets_static
  9. LOCAL_WHOLE_STATIC_LIBRARIES+=wxsqlite3_static##引入静态库
  10. LOCAL_CFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  11. LOCAL_EXPORT_CFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  12. LOCAL_CPPFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  13. LOCAL_EXPORT_CPPFLAGS+=-DCC_ENABLE_CHIPMUNK_INTEGRATION=1
  14. LOCAL_CFLAGS:=-fexceptions
  15. LOCAL_CFLAGS+=-DSQLITE_HAS_CODEC##该宏用于开启加密功能
  16. LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
  17. $(LOCAL_PATH)/CCBReader
  18. $(LOCAL_PATH)/GUI/CCControlExtension
  19. $(LOCAL_PATH)/GUI/CCScrollView
  20. $(LOCAL_PATH)/network
  21. $(LOCAL_PATH)/LocalStorage
  22. $(LOCAL_PATH)/CCArmature
  23. LOCAL_C_INCLUDES:=$(LOCAL_PATH)/../scripting/lua/cocos2dx_support
  24. $(LOCAL_PATH)/../scripting/lua/lua
  25. include$(BUILD_STATIC_LIBRARY)


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:修改cocos2dcocosstoragelocal-storage目录下的Android.mk,删除LOCAL_SRC_FILES字段中的LocalStorageAndroid.cpp

Cocos2d-x2.0:修改cocos2d-x-2.xextensions目录下的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)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读