[Unity,SQLiteUnityKit]Android&SQLiteUnityKitで、DBが更新されない問題

前回のUnity&SQLite関連の続き

 

今回は、SQLiteUnityKitを使用していてハマった問題について。

※2016年1月2日現在の問題なので、もしかすると修正されているかもしれません。

各自ご確認をお願い致します。

 

 

DBのデータを更新しても、端末のデータに反映されない!!

 

今回、ゲームのマスターデータを管理するためにSQLiteを導入してみたわけですが、

そのマスターデータを更新→Unityで変更を確認→Android端末で確認→DBのデータが更新されていない

という事態に遭遇したわけです。

 

この問題、セーブロードをSQLiteで実装したい人にとっては、Unityエディタでは思うように動かず、Androidだと動く。

僕みたいに、マスターデータを管理したい人にとっては、Unityエディタでは動いて、Androidだと動かない。

 

 

調べてみると、日本語のサイトでも理由が書いてあるところがいくつか見つかりました。

 

SQLiteを使用する場合は、DBデータを「StreamingAssets」フォルダに入れて使用するのがセオリーになっていますが、

このStreamingAssetsフォルダに入れたデータ、実は曲者。

アプリ側からは一切実行・変更ができないフォルダにインストールされるようです。

 

そのため、SQLiteUnityKitではStreamingAssetsフォルダのDBデータを

1.データの変更ができるフォルダにコピー

2.コピーしたファイルで読み書き

という方法をとっています。

(多分SQLiteUnityKitでなくても、この方法)

 

SQLiteUnityKitでは、元のDBファイルが更新されたかどうかをチェックしていないので、

一度ファイルをコピーしたら、そのファイルしか読み込まない!

なので、データ更新を反映させたい場合は、自前でそういうことができる実装をしなければならない…!

 

と、ここまでは調べてみると、いくつかのサイト様が書かれているので、分かることなのです。

 

ならば検証だ

 

ここから先は検証してみてわかったこと。

上記のことが分かり、「まじかー」と思いつつ、しょうがないのでSQLiteUnityKitの中身を見てみると…

 

SqliteDatabase.cs


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))) {
…

 

 

あれ…?

更新チェックやってるじゃん?!

 

pathDBがコピーしたDBファイルのパス

sourcePathが元々のDBファイルのパス

System.Data.File.GetLastWriteTimeUtcというのは、ファイルの最終更新時間を取得するもの。

 

実際、UnityでpathDBとsourcePathの更新時間をチェックしてみると…

unity_sqlitekit

 

ちゃんと動いてますね。

 

ということは、Androidは…

Android_Device_Monitor

 

sourcePathの方だけ取れてないですね…

というか、これって多分端末によってはちゃんと取れたり、取れなかったりする一番厄介なパターンなんじゃ…

 

ちゃんと動作する端末しか持っていない個人開発者様は、

これに気づかずアップデートしてレビューに「更新されない」って書かれるパティーンです。

 

これは困ったちゃんですね。

 

 

で、じゃあどうしようかという話なのですが、

基本的には、DBのバージョン管理なりを実装して、しっかりとした対応をしたほうがいいと思います。

セーブロードをSQLiteで管理したい!という方は特に。

セーブ消えた時のレビューの荒れ方はやばいので…(経験済み)

 

下記に差分アップデートができるようにする方法が載っていますので、参考にされると良いと思います。

[Unity]SQLiteUnityKitに差分アップデート実装してみた(杏z 学習帳 様)

 

とにかく急いで対応したい!

SQLiteはマスターデータしか扱わない!

という、僕のような方は、以下の様な応急処置もありだと思います。

 

下記のif文をコメントアウトして、毎回ファイルをコピーするようにする。

if (!System.IO.File.Exists (pathDB) || (System.IO.File.GetLastWriteTimeUtc(sourcePath) > System.IO.File.GetLastWriteTimeUtc(pathDB))) {
}

 

 

アプリ起動するたびにDBファイルをコピーするという、なんとも残念な対応ですが、

個人開発級のマスターデータならいいんじゃね?って思える方はとりあえずこちらで対応してみても良いのではないでしょうか。

 

以上、少しでもお役に立てていれば光栄です。

LINEで送る
Pocket

You can leave a response, or trackback from your own site.

One Response to “[Unity,SQLiteUnityKit]Android&SQLiteUnityKitで、DBが更新されない問題”

  1. […] また、ちょっと別の問題なのですが、端末によってはStreamingAssetsのDBファイルと更新日付が正常に取得できないことがあるらしいです。 >>[Unity,SQLiteUnityKit]Android&SQLiteUnityKitで、DBが更新されない問題 じーにあ… […]

Leave a Reply

*

Powered by WordPress | Designed by: wordpress themes 2011 | Thanks to Best WordPress Themes, Find WordPress Themes and