Cocos2d-xでiPhone&Androidアプリ開発記9 SQLiteの注意点

SQLite

Cocos2d-xからSQLiteを使うには、iOSとAndroidそれぞれにライブラリが用意されてはいますが、ソースを共通化するためSQLiteのソースから組み込む方法が良いようです。

ソースからコンパイルと言うと何やら大変そうですが、やってみると凄く簡単。.cと.hの2つのファイルをClassesに追加するだけ。環境依存とか起きないんですね。組み込んでしまえば、あとはいつもどおりSQL文をぶち込めます。

私はPHPでsqlite3のファイルを作成して、それを読み込み専用で組み込もうとしたんですが、iOSは問題なかったのですがAndroidでハマりました。

スポンサーリンク

Androidはassetsフォルダのファイルが読めない

iOSの場合、

CCFileUtils::sharedFileUtils()->fullPathForFilename("file.db");

でResourcesフォルダのdbファイルを読み込んでくれますが、Androidは読み込みに失敗します。ちなみにAndroidのResourcesフォルダはassetsフォルダになります。

画像は読めるのにとリサーチしたところ、Androidの場合はapkファイルがzip圧縮されているので、画像以外のファイルはそのままでは読めないようです。画像はCocos2d-xが勝手に解凍してくれてたんですね。

そのためsqlite3を使うには、

CCFileUtils::sharedFileUtils()->getWritablePath()+"file.db";

をsqlite3_openに渡し、書き込み可能領域に新規にファイルを作る必要があるようです。

よそで作ったdbファイルを使うには、最初の起動時にWritableエリアにdbファイルをコピーすれば可能のようですが、それなりの規模のファイルだと時間もかかりそうなので、読み込み専用でsqliteを使うのなら、素直に他の方法にした方がよいかもです。

といっても仮にテキストファイルであっても、assetsフォルダ内ではfopenやifstreamが失敗します。 しかし、この問題を解決してくれる関数が用意されていました。

createWithContentsOfFile("file.txt");

私の場合、読み込みたいファイルが巨大だったので、ifstreamで部分的に読んだほうが効率的だと思ってましたが、素直にcreateWithContentsOfFileを使うのが良さそうです。

 

SQLiteの組み込み

SQLite Home Page

からソースをダウンロードして、

  • sqlite3.c
  • sqlite.h

をプロジェクトのClassesに追加。

Androidはproj.android/jni/Android.mkのLOCAL_SRC_FILESも編集しておくこと。

用意はこれだけ簡単です。SQL文はこのように。

#include "sqlite3.h" sqlite3* db = NULL; std::string path = CCFileUtils::sharedFileUtils()->getWritablePath()+SQLITE; std::string data; int id = 1; if ( sqlite3_open( path.c_str() ,&db) == SQLITE_OK ){ sqlite3_stmt* stmt = NULL; if (sqlite3_prepare_v2(db, "SELECT hoge FROM test WHERE id=?", -1, &stmt, NULL) == SQLITE_OK ) { sqlite3_bind_int(stmt, 1, id ); int ret = sqlite3_step(stmt); if ( ret ==SQLITE_DONE || ret == SQLITE_ROW ) { data = (const char *) sqlite3_column_text(stmt, 0); } sqlite3_reset(stmt); } sqlite3_finalize(stmt); } sqlite3_close(db);

 

 

スポンサーリンク