【格納】Cococos 2 d-x統合wxSQLite 3


【説明】
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