SQLiteとUnityとAndroid
一年ぶりにnoteを開いて、そして書いておきたいのは再びSQLite
1年前は何も分からずにSQLiteと使っていましたが、構築終わっていざビルディングして起動すると、PCは問題なく使えますが、android端末で完全スルー。
まず押さえておかないといけないのは、AndroidはJavaで動いている為なのか、ところどころルールが変わるようです。
そのために、Gradleという機能を使うようです。これはAndroid端末で弾かれるエラーなども一緒にデバッグしてくれるようなので便利です。
今まではSQLiterというunityのアセットを使っていましたが、これを使うとMono.Data.SqliteClientを使う必要があるようなのですが、これが古くて推奨されていないとこと。
なので、SQLite4unity3dに変更。
SDKはunityが持っているのでそれを利用します。
Android端末でデータベースを読みに行く場合は、
Assets/
+ Plugins/
+ Android/
+ SQLite4unity3d/
+ Plugins/
+ Android/
+ libs/
+ arm64-v8a/
libsqlite3.so
+ armeabi-v7a/
libsqlite3.so
+ x86/
libsqlite3.so
+ WSA/
+ x64/
sqlite3.dll
+ x86/
+ StreamingAssets
もしかしたらSQLite4unity3dの下が被っているので、Assets直下にSQLite4unity3dに展開するのが正解かと思いますが、この構成になります。
この状態になると、展開時にx64とx86フォルダの下にsqlite3.dllが存在するので実行エラーになるので、どちらか使わない方を消す。
StreamingAssetsフォルダは自分で作成してOK(何かをインストールすると作られることもあるよう)
dbファイルはStreamingAssetsに入れる
パーミッションの設定 "C:\Users\user\Unityプロジェクト名\Library\Bee\Android\Prj\Mono2x\Gradle\launcher\src\main"にある AndroidManifest.xmlに<uses-permission android:name="android.permission.INTERNET" />を追加する
これは、StreamingAssetsにファイルを置くことで、Androidから直接ファイルを読みに行くのではなくHTTPリクエストを使用してアクセスする必要がある為のようです。
なので
UnityWebRequest loadDb = UnityWebRequest.Get(Application.streamingAssetsPath + "データベース名.db");
という処理が必要になって、ここのパーミッションを開ける感じです。
loadDb.SendWebRequest();
でDBを呼び出します。
また、SendWebRequestは接続確認をするまで次の処理に行かないようにするために
while (!loadDb.isDone)
でループで回すようです。(Unityフォーラムより)
もちろんタイムアウトの処理も必要です。
PCで動かす時とモバイルでのパスが違い、モバイル時は databasePath = databasePath.Replace("URI=file:", "");になるので、File.Exists(databasePath)で分岐する
SQLite4unity3dの場合は、SendWebRequest → UnityWebRequest
になるのも気を付けなければいけないことの一つ。
なかなか苦しい戦いでした