見出し画像

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
になるのも気を付けなければいけないことの一つ。

なかなか苦しい戦いでした


この記事が気に入ったらサポートをしてみませんか?