Skip to content

cocos2d-xで予め用意しておいたSQLiteを利用する方法

2013年4月17日

SQLiteを使うときは、データの保存も当然ながら、予めのデフォルトデータを持たせておきたいものです。

しかし、iOSでは所定の場所にDBを置いておかないとリジェクトを食らう可能性があります。

しかし所定の場所に、cocos2d-xでは予め置いておくことができなかった…。

というわけで以下のようにして解決しました。

一旦resourcesに置いておいて、起動時に所定の場所にコピーする。

という方法です。

結果DBが2個できちゃう感じになりましたけど、これで解決出来ます。

コードは以下

※大前提として、sqlite.cとsqlite.hなどのソースコードをインポートする必要があります。

AppController.mm

/**
 * ResourceからWritablePath(library/Cache)にリソースDBをコピーする。
 *
 **/

 sqlite3* db;

 NSString* work_path;
 NSString* database_filename;

 NSString* database_path;
 NSString* template_path;

 // データベース名
 database_filename = @"resource.db";

 NSArray* paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
 work_path = [paths objectAtIndex:0];

 // データベースファイルのパスを取得します。
 database_path = [NSString stringWithFormat:@"%@/%@", work_path, database_filename];

// 文書フォルダーにデータベースファイルが存在しているかを確認します。
 NSFileManager* manager = [NSFileManager defaultManager];

 if (![manager fileExistsAtPath:database_path]){
 NSError* error = nil;

 // 文書フォルダーに存在しない場合は、データベースの複製元をバンドルから取得します。
 template_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:database_filename];

 // バンドルから取得したデータベースファイルを文書フォルダーにコピーします。
 if (![manager copyItemAtPath:template_path toPath:database_path error:&error])
 {
 // データベースファイルのコピーに失敗した場合の処理です。
 }
 }

 // 文書フォルダーに用意されたデータベースファイルを開きます。
 if (sqlite3_open([database_path UTF8String], &db) == SQLITE_OK){
 // データベースファイルを SQLite で開くことに成功しました。
 }

こんなかんじにしとくと、wratablePathにsqliteをコピー出来ます。
Androidとかはまた別のコードをAndroid側に書いてやる必要があります。
まあAndroidはコピーしなくても取れるんですけど。

参考まで。

広告

From → cocos2d, cocos2d-x

コメントする

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。