【格納】Cococos 2 d-x統合wxSQLite 3
10185 ワード
【説明】
Cococos 2 d-xはSQLite 3を統合していますが、暗号化処理はしていません.wxSQLite 3はオープンソースの項目で、SQLite 3のC++パッケージに対して暗号化処理をしていますので、使いやすいです.ここで私がwxSQLite 3をまとめる過程を紹介します.期間は他の大神の文章を参考にして、後に説明しました.
【ダウンロード】
http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/
【集積】
1.wxSQLite 3をダウンロードして解凍します. wxsqlite 3-3.2.1\sqlite 3\secure\srcフォルダをプロジェクトにコピーします.
2.wxSQLite 3の内部で既に引用されているので、Xcodeでは「sqlite 3.h」と「sqlite 3 secure.c」の2つのファイルを引用するだけで、他のファイルを引用するとコンパイルエラーが発生します.
3.暗号化機能が必要なので、「sqlite 3.h」と「sqlite 3 secure.c」の両方のファイルに暗号化マクロ定義を追加する必要があります.ここではプリコーディングのマクロ定義を使っていません.プラットフォームとは関係のない方式を使うほうがいいからです.しかし、ここでは追加された位置に注意してください.でないと、コンパイルが間違っているかもしれません.
5.以上はXcode上の集積過程で、Androidプラットフォームに対してAndroid.mkファイルを作成する必要があります.この部分はネット上の文章を参考にして、まだ実践していません.
Cococos 2 d-xはSQLite 3を統合していますが、暗号化処理はしていません.wxSQLite 3はオープンソースの項目で、SQLite 3のC++パッケージに対して暗号化処理をしていますので、使いやすいです.ここで私がwxSQLite 3をまとめる過程を紹介します.期間は他の大神の文章を参考にして、後に説明しました.
【ダウンロード】
http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/
【集積】
1.wxSQLite 3をダウンロードして解凍します. wxsqlite 3-3.2.1\sqlite 3\secure\srcフォルダをプロジェクトにコピーします.
2.wxSQLite 3の内部で既に引用されているので、Xcodeでは「sqlite 3.h」と「sqlite 3 secure.c」の2つのファイルを引用するだけで、他のファイルを引用するとコンパイルエラーが発生します.
3.暗号化機能が必要なので、「sqlite 3.h」と「sqlite 3 secure.c」の両方のファイルに暗号化マクロ定義を追加する必要があります.ここではプリコーディングのマクロ定義を使っていません.プラットフォームとは関係のない方式を使うほうがいいからです.しかし、ここでは追加された位置に注意してください.でないと、コンパイルが間違っているかもしれません.
#ifndef SQLITE_HAS_CODEC
#define SQLITE_HAS_CODEC
#endif
4.ここに導入すればすでに完了しています.もしコンパイルが「SQLITEUUSERUAUTHENTICATION」にエラーが発生したら、エラーが発生した位置を「铇if」と全部「钮ifdef」に変更すればいいです.他のところにも同様のミスがあれば解決できます.5.以上はXcode上の集積過程で、Androidプラットフォームに対してAndroid.mkファイルを作成する必要があります.この部分はネット上の文章を参考にして、まだ実践していません.
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)
は、jni/Android.mkに引用を追加する.<pre name="code" class="cpp">LOCAL_CFLAGS += -DSQLITE_HAS_CODEC #
LOCAL_WHOLE_STATIC_LIBRARIES += wxsqlite3_static #
$(call import-module,../Classes/wxsqlite3) # (Android.mk )
【使用】
使用部分可以参考Cocos2d-x自带的 LocalStorage 类,加密功能需要在 “sqlite3_open()” 和 “sqlite3_close()” 之间调用 “sqlite3_key()” 设置密码。
【コード】// SET KEY #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) sqlite3_key(_db, key.c_str(), (int)key.size()); #endif
最後に私の封緘(xiu)の類を添付します.ほとんどはLocal Strageのコードです.少しだけ修正しました.もともとは一例のモードを作っていましたが、集中的に保存を一つの種類にまとめるつもりです.使いやすくて、普通のタイプに変えました.前の方がポイントです.この部分は重要ではありません.//==================================================================================== // LSqlite.h // Local storage by sqlite3. // Use wxsqlite3 in order to encrypt data. // Created by Dolphin Lee. //==================================================================================== #ifndef __L_SQLITE_H__ #define __L_SQLITE_H__ #include "cocos2d.h" USING_NS_CC; #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #include "sqlite3.h" #else #include "wxsqlite3/sqlite3.h" #endif //==================================================================================== class LSqlite { public: /** * Constructor function. */ LSqlite(); /** * Frees the allocated resources and close database. */ ~LSqlite(); public: /** * Initializes the database. If path is null, it will create an in-memory DB. * @param filename Name of database file. (like "data.db") * @param key The key to encrypt database. */ void init(const std::string& filename, const std::string& key); /** * Sets an item in the LS. * The item is divided into key and values. */ void setItem(const std::string& key, const std::string& value); /** * Gets an item from the LS. * Will return the value according to key. */ std::string getItem(const std::string& key); /** * Removes an item from the LS. * Will delete the value according to key. */ void removeItem(const std::string& key); protected: /** * Initializes the database. If path is null, it will create an in-memory DB. * @param fullpath Full path with file name. * @param key The key to encrypt database. */ void initWithFullpath(const std::string& fullpath, const std::string& key); /** * Create table in the database. * This function has been invoked in init, you don't need to call. */ void createTable(); private: int _initialized; sqlite3 *_db; sqlite3_stmt *_stmt_select; sqlite3_stmt *_stmt_remove; sqlite3_stmt *_stmt_update; }; //==================================================================================== #endif
【参考】//==================================================================================== // LSqlite.cpp //==================================================================================== #include "LSqlite.h" #include <stdio.h> #include <stdlib.h> #include <assert.h> //==================================================================================== // Create //==================================================================================== /** constructors */ LSqlite::LSqlite() { _initialized = 0; _db = nullptr; _stmt_select = nullptr; _stmt_remove = nullptr; _stmt_update = nullptr; } /** free database */ LSqlite::~LSqlite() { if( _initialized ) { sqlite3_finalize(_stmt_select); sqlite3_finalize(_stmt_remove); sqlite3_finalize(_stmt_update); sqlite3_close(_db); _initialized = 0; } } /** create table */ void LSqlite::createTable() { const char *sql_createtable = "CREATE TABLE IF NOT EXISTS data(key TEXT PRIMARY KEY,value TEXT);"; sqlite3_stmt *stmt; int ok=sqlite3_prepare_v2(_db, sql_createtable, -1, &stmt, NULL); ok |= sqlite3_step(stmt); ok |= sqlite3_finalize(stmt); if( ok != SQLITE_OK && ok != SQLITE_DONE) { printf("[sqlite3] Error in CREATE TABLE
"); } } /** init database */ void LSqlite::initWithFullpath( const std::string& fullpath, const std::string& key) { if( ! _initialized ) { int ret = 0; // OPEN DATABASE if (fullpath.empty()) { ret = sqlite3_open(":memory:",&_db); } else { ret = sqlite3_open(fullpath.c_str(), &_db); } // SET KEY #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) sqlite3_key(_db, key.c_str(), (int)key.size()); #endif // EXPAND FUNCTION //sqlite3_exec(_db, "PRAGMA synchronous = OFF", 0 ,0, 0); // //sqlite3_exec(_db, "PRAGMA cache_size = 8000", 0 ,0, 0); // //sqlite3_exec(_db, "PRAGMA count_changes = 1", 0 ,0, 0); // //sqlite3_exec(_db, "PRAGMA case_sensitive_like = 1", 0 ,0, 0); // LIKE // CREATE TABLE createTable(); // SELECT const char *sql_select = "SELECT value FROM data WHERE key=?;"; ret |= sqlite3_prepare_v2(_db, sql_select, -1, &_stmt_select, NULL); // REPLACE const char *sql_update = "REPLACE INTO data (key, value) VALUES (?,?);"; ret |= sqlite3_prepare_v2(_db, sql_update, -1, &_stmt_update, NULL); // DELETE const char *sql_remove = "DELETE FROM data WHERE key=?;"; ret |= sqlite3_prepare_v2(_db, sql_remove, -1, &_stmt_remove, NULL); if( ret != SQLITE_OK ) { printf("[sqlite3] Error initializing DB
"); // report error } _initialized = 1; } } //==================================================================================== // Functions //==================================================================================== /** init database */ void LSqlite::init(const std::string& filename, const std::string& key) { std::string path = FileUtils::getInstance()->getWritablePath(); path += filename; initWithFullpath(path, key); } /** sets an item in the LS */ void LSqlite::setItem( const std::string& key, const std::string& value) { assert( _initialized ); int ok = sqlite3_bind_text(_stmt_update, 1, key.c_str(), -1, SQLITE_TRANSIENT); ok |= sqlite3_bind_text(_stmt_update, 2, value.c_str(), -1, SQLITE_TRANSIENT); ok |= sqlite3_step(_stmt_update); ok |= sqlite3_reset(_stmt_update); if( ok != SQLITE_OK && ok != SQLITE_DONE) { printf("[sqlite3] Error in locaLSqlite.setItem()
"); } } /** gets an item from the LS */ std::string LSqlite::getItem( const std::string& key ) { assert( _initialized ); std::string ret; int ok = sqlite3_reset(_stmt_select); ok |= sqlite3_bind_text(_stmt_select, 1, key.c_str(), -1, SQLITE_TRANSIENT); ok |= sqlite3_step(_stmt_select); const unsigned char *text = sqlite3_column_text(_stmt_select, 0); if (text) { ret = (const char*)text; } if( ok != SQLITE_OK && ok != SQLITE_DONE && ok != SQLITE_ROW) { printf("[sqlite3] Error in locaLSqlite.getItem()
"); } return ret; } /** removes an item from the LS */ void LSqlite::removeItem( const std::string& key ) { assert( _initialized ); int ok = sqlite3_bind_text(_stmt_remove, 1, key.c_str(), -1, SQLITE_TRANSIENT); ok |= sqlite3_step(_stmt_remove); ok |= sqlite3_reset(_stmt_remove); if( ok != SQLITE_OK && ok != SQLITE_DONE) { printf("[sqlite3] Error in locaLSqlite.removeItem()
"); } } //==================================================================================== // //====================================================================================
http://blog.csdn.net/linchaolong/article/details/41286297
http://www.yiwuye.com/archives/cocos2d-x-encrpt-sqlite.html
http://www.cocoachina.com/bbs/read.php?tid=199953