読者です 読者をやめる 読者になる 読者になる

フニゲの開発日記

Electronとか...

Cocos2d-xでsqlite3を使う


 iOSだけなら、XCodeに入っているlibsqlite3.0.dylibを使う手もあるんだけど。

A simple Tutorial How to use SQLite in cocos2d-x ……(Tutorial by YUYE) - Cocos2d-x Forum

 YUYEさんのGitHubからsqlite3.cとsqlite3.hをコピーして、自分のプロジェクトに追加する。ソース見るとバージョンは3.7.10なので、iOSのsqliteでは使えない全文検索もできるはず(試してません)。

 データベースはリソースとして読み込んで、初回の起動時に読み書き可能な場所にコピーしておく。

#include "sqlite3.h"
...

    CCFileUtils *fileUtils = CCFileUtils::sharedFileUtils();
    std::string path = fileUtils->getWritablePath();
    path += "db.sqlite";

    FILE* file = fopen(path.c_str(), "r");
    if (file == NULL) {
        // データベースが存在しないときは、リソースからコピーする
        CCLog("copy org.sqlite to db.sqlite");

        unsigned long size;
        const char* data = (char*)fileUtils->getFileData("org.sqlite", "rb", &size);

        file = fopen(path.c_str(), "wb");
        fwrite(data, size, 1, file);
        CC_SAFE_DELETE_ARRAY(data);

    }
    fclose(file);

 データベースへのアクセスは、sqlite3_prepare_v2とか使うらしいのだけど、まあゲームのデータなんてたいした量じゃないので、とりあえずsqlite3_exec(とsprintf)でベタに書いてもいいのかな。

    // テーブルhogeの内容をぜんぶ取得してみる
    sqlite3 *db = NULL;
    int result;

    result = sqlite3_open(path.c_str(), &db);
    if (result != SQLITE_OK) CCLog("open database failed %d", result);

    sqlite3_exec(db, "select * from hoge", callback, NULL, NULL);
    sqlite3_close(db);

 sqlite3_execから呼ばれるコールバックはこんな感じ。

static int callback(void *notUsed, int argc, char **argv, char **colNames) {
   int i;
   for (i = 0; i < argc; i++) {
       CCLog("%s=%s\n", colNames[i], argv[i] ? argv[i] : "NULL");
   }
   CCLog("\n");
   return 0;
}
広告を非表示にする