主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity

2016年4月19日火曜日

SQLiteUnityKitを使う(SQLiteUnityKit導入編)

参考

  1. 導入編
    1. Mac寄りの解説
    2. Windows寄りの解説
  2. SQLite対応のGUIの検討
    1. 過去の記事(SQLite対応のGUI)
  3. C#とSQLiteについて
    1. 過去の記事(C#によるSQLiteの操作)
  4. UnityとSQLiteについて
    1. 過去の記事(SQLiteとUnity)
  5. データベースの周辺知識
    1. 過去の記事(データベースの種類や用語)

注意

Build SettingのプラットフォームがWeb Playerだとエラーが出る(参考)。

本題


1. SQLiteUnityKitの導入

冒頭参考の「導入編」リンク先の解説に従い、SQLiteUnityKitを自身のProjectに加える。ただし、SqliteDatabase.csには知っておくべき内容があるのでチェックした方が良い。下に示すのはSqliteDatabase.csのコンストラクター(初期化)を抜粋したものである。

public SqliteDatabase (string dbName)
{
pathDB = System.IO.Path.Combine (Application.persistentDataPath, dbName);
//original path
string sourcePath = System.IO.Path.Combine (Application.streamingAssetsPath, dbName);
//if DB does not exist in persistent data folder (folder "Documents" on iOS) or source DB is newer then copy it
if (!System.IO.File.Exists (pathDB) || (System.IO.File.GetLastWriteTimeUtc(sourcePath) > System.IO.File.GetLastWriteTimeUtc(pathDB))) {
if (sourcePath.Contains ("://")) {
// Android
WWW www = new WWW (sourcePath);
// Wait for download to complete - not pretty at all but easy hack for now
// and it would not take long since the data is on the local device.
while (!www.isDone) {;}
if (String.IsNullOrEmpty(www.error)) {
System.IO.File.WriteAllBytes(pathDB, www.bytes);
} else {
CanExQuery = false;
}
} else {
// Mac, Windows, Iphone
//validate the existens of the DB in the original folder (folder "streamingAssets")
if (System.IO.File.Exists (sourcePath)) {
//copy file - alle systems except Android
System.IO.File.Copy (sourcePath, pathDB, true);
} else {
CanExQuery = false;
Debug.Log ("ERROR: the file DB named " + dbName + " doesn't exist in the StreamingAssets Folder, please copy it there.");
}
}
}
}

注意点

  1. 冒頭参考の「UnityとSQLiteについて」で語られていた内容がここに当たる
    1. Android端末はStreamingAssetsに直接アクセスできない
    2. データベースをPersistentDataPathにコピーする
    3. これによりAndroid・iOS共に同じ記述で処理できるようになる
  2. コピーが起きる条件は下記のいずれかである(上記スクリプトの9行目)
    1. 引数で受け取った名前のファイルがPersistentDataPathに無い場合
    2. ファイルの更新日を比較して、PersistentDataPathの方が古い場合

特にファイルの更新日でデータベースが上書きされてしまうのが厄介。File.Copyの第3引数のtrueは「上書き保存を許可する」の意味である。これにより、端末に保存したユーザーデータが簡単にリセットされてしまう。

コピー条件の後者は削除して、「ファイルが存在しない時のみコピー」とした方が無難。完全に書き換えたい場合は、PersistentDataPathのファイルを削除すれば良い。これにより同名のファイルが無くなるので、StreamingAssetsからコピーされる。なお、こちらのサイトでは引数を増やして対応していた。

0 件のコメント:

コメントを投稿