【Cocos2d-x】整合wxSqlite3到Cocos2d-x

峻峰飛陽發表於2016-11-14


關於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,               //資料庫引用
  const void *pKey,          //新密碼
  int nKey                   //密碼長度
);


示例:在LocalStorage.cpp中的localStorageInit方法中初始化資料庫時設定密碼

[cpp] view plain copy
  1. void localStorageInit( const char *fullpath)  
  2. {  
  3.     if( ! _initialized ) {  
  4.   
  5.         int ret = 0;  
  6.           
  7.         if (!fullpath)  
  8.             ret = sqlite3_open(":memory:",&_db);  
  9.         else  
  10.             ret = sqlite3_open(fullpath, &_db);  
  11.   
  12.         // 設定密碼  
  13.         #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)  
  14.             sqlite3_key(_db,"test",4);  
  15.         #endif        
  16.   
  17.         localStorageCreateTable();  
  18.   
  19.         // SELECT  
  20.         const char *sql_select = "SELECT value FROM data WHERE key=?;";  
  21.         ret |= sqlite3_prepare_v2(_db, sql_select, -1, &_stmt_select, NULL);  
  22.   
  23.         // REPLACE  
  24.         const char *sql_update = "REPLACE INTO data (key, value) VALUES (?,?);";  
  25.         ret |= sqlite3_prepare_v2(_db, sql_update, -1, &_stmt_update, NULL);  
  26.   
  27.         // DELETE  
  28.         const char *sql_remove = "DELETE FROM data WHERE key=?;";  
  29.         ret |= sqlite3_prepare_v2(_db, sql_remove, -1, &_stmt_remove, NULL);  
  30.   
  31.         if( ret != SQLITE_OK ) {  
  32.             printf("Error initializing DB\n");  
  33.             // report error  
  34.         }  
  35.           
  36.         _initialized = 1;  
  37.     }  
  38. }  


測試工程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 := $(LOCAL_PATH)/src
#構建靜態庫
include $(BUILD_STATIC_LIBRARY)
 來自CODE的程式碼片
Android.mk


2.工程中引入wxsqlite3靜態庫

cocos2d-x3.x:修改cocos2d\cocos\storage\local-storage目錄下的Android.mk檔案如下

[plain] view plain copy
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE := cocos_localstorage_static  
  5.   
  6. LOCAL_MODULE_FILENAME := liblocalstorage  
  7.   
  8. LOCAL_SRC_FILES := LocalStorage.cpp  
  9.   
  10.   
  11. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/..  
  12.   
  13.   
  14. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../..  
  15.   
  16. LOCAL_CFLAGS += -Wno-psabi  
  17. LOCAL_CFLAGS += -DSQLITE_HAS_CODEC  ##該巨集用於開啟加密功能  
  18. LOCAL_EXPORT_CFLAGS += -Wno-psabi  
  19.   
  20. LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static  
  21. LOCAL_WHOLE_STATIC_LIBRARIES += wxsqlite3_static #引入靜態庫  
  22.   
  23. include $(BUILD_STATIC_LIBRARY)  
  24.   
  25. $(call import-module,.)  
  26. $(call import-module,external/wxsqlite3)  #引入模組  

cocos2d-x2.x:修改cocos2d-x-2.x\extensions目錄下的Android.mk檔案如下,直接把加密功能增加到引擎擴充套件庫

[plain] view plain copy
  1. LOCAL_PATH := $(call my-dir)    
  2. include $(CLEAR_VARS)    
  3.     
  4. LOCAL_MODULE    := cocos_extension_static    
  5.     
  6. LOCAL_MODULE_FILENAME := libextension    
  7.     
  8. LOCAL_SRC_FILES := AssetsManager/AssetsManager.cpp \    
  9. ##太長,這裡就省略了原始檔的匯入##    
  10.     
  11.     
  12. LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static    
  13. LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static    
  14. LOCAL_WHOLE_STATIC_LIBRARIES += cocos_curl_static    
  15. LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static    
  16. LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static    
  17. LOCAL_WHOLE_STATIC_LIBRARIES += libwebsockets_static    
  18. LOCAL_WHOLE_STATIC_LIBRARIES += wxsqlite3_static ##引入靜態庫    
  19.     
  20. LOCAL_CFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1    
  21. LOCAL_EXPORT_CFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1    
  22. LOCAL_CPPFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1    
  23. LOCAL_EXPORT_CPPFLAGS += -DCC_ENABLE_CHIPMUNK_INTEGRATION=1    
  24.   
  25. LOCAL_CFLAGS := -fexceptions  
  26. LOCAL_CFLAGS += -DSQLITE_HAS_CODEC  ##該巨集用於開啟加密功能   
  27.   
  28. LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) \    
  29.                            $(LOCAL_PATH)/CCBReader \    
  30.                            $(LOCAL_PATH)/GUI/CCControlExtension \    
  31.                            $(LOCAL_PATH)/GUI/CCScrollView \    
  32.                            $(LOCAL_PATH)/network \    
  33.                            $(LOCAL_PATH)/LocalStorage \    
  34.                $(LOCAL_PATH)/CCArmature    
  35.     
  36. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../scripting/lua/cocos2dx_support \    
  37.                     $(LOCAL_PATH)/../scripting/lua/lua    
  38.   
  39.                         
  40. include $(BUILD_STATIC_LIBRARY)    
  41.     
  42. $(call import-module,cocos2dx)    
  43. $(call import-module,CocosDenshion/android)    
  44. $(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)    
  45. $(call import-module,external/Box2D)    
  46. $(call import-module,external/chipmunk)    
  47. $(call import-module,external/libwebsockets/android)    
  48. $(call import-module,external/wxsqlite3)  ##引入模組    


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, const void *pKey, int nKey),引數同上。

清空金鑰為 sqlite3_rekey( db, NULL, 0)。



相關文章