Cocos2d-JSでSQLite
Cocos2d-JSネイティブアプリ(not ブラウザ)でsqliteを使う。
方針
- javascriptからsqlを実行出来て、json形式で結果を受け取れるようにする。
- cocos2d-jsのapiにはsqliteを扱う仕組みが無いので、下記の仕組みを使ってc++とバインディングする
公式
How to bind a custom class to js runtime | Documents | Cocos2d-x
参考サイト
Cocos2d-JS v3.0 で他の言語とやり取り (JavaScript → C++ 編) | ましろいろのねこ
準備
C++では
- sqlite3
- picojson
を使用させてもらっていますので、それぞれ設定をします
実装
bindするソース
SQLiteBridge.h
#ifndef __BRIDGE_H__ #define __BRIDGE_H__ #include "sqlite3.h" #include <iostream> class SQLiteBridge { private: sqlite3 *useDataBase = NULL; public: SQLiteBridge(std::string dbFileName); ~SQLiteBridge(); std::string execSql(std::string sql); }; #endif
SQLiteBridge.cpp
#include "SQLiteBridge.h" #include "cocos2d.h" #include "sqlite3.h" #include "picojson.h" using namespace cocos2d; using namespace std; SQLiteBridge::SQLiteBridge(std::string dbFileName) { char *errorMessage; //DBファイルの保存先のパス auto filePath = FileUtils::getInstance()->getWritablePath(); filePath.append(dbFileName); auto status = sqlite3_open(filePath.c_str(), &this->useDataBase); if (status != SQLITE_OK){ CCLOG("open failed : %s", errorMessage); return; } } SQLiteBridge::~SQLiteBridge() { CCLOG("SQLiteBridge::~SQLiteBridge"); sqlite3_close(useDataBase); } static int execSqlCallback(void *data, int argc, char **argv, char **azColName){ picojson::array *resultArray = (picojson::array *)data; picojson::object obj; int i; for(i=0; i<argc; i++){ obj.insert(std::make_pair(azColName[i], picojson::value(argv[i]))); } resultArray->push_back(picojson::value(obj)); return 0; } std::string SQLiteBridge::execSql(std::string sql) { CCLOG("SQLiteBridge::execSql start : %s", sql.c_str()); char *errorMessage; picojson::object result; picojson::array resultArray; auto status = sqlite3_exec(useDataBase, sql.c_str(), execSqlCallback, &resultArray, &errorMessage); result.insert(std::make_pair("status", picojson::value(double(status)))); if( status != SQLITE_OK ){ CCLOG("execSql failed : %s", errorMessage); result.insert(std::make_pair("errorMessage", picojson::value(errorMessage))); }else{ result.insert(std::make_pair("result", picojson::value(resultArray))); } picojson::value json = picojson::value(result); return json.serialize(); }
使い方
var accesser = new jsb.SQLiteBridge("My.db"); var sql1 = "CREATE TABLE hoge (id integer primary key autoincrement);"; var ret1 = accesser.execSql(sql1); var json1 = JSON.parse(ret1); if(json1.status !== 0){ cc.log("error!!!"); return; } var sql2 = "SELECT count(*) as cnt FROM hoge"; var ret2 = accesser.execSql(sql2); var json2 = JSON.parse(ret2); if(json2.status !== 0){ cc.log("error!!!"); return; } cc.log("cnt >>> " + json2.result[0].cnt);