UnityでSQLiteを使用できるように色々奮闘してみた。

スクリーンショット 2012-09-16 13.09.21

■UnityでSQLiteを使う

不思議なお菓子さんの提供している「NrapmedSQLite」を利用すれば簡単にSQLiteを使用することができる。以前はSystem.Data.SQLiteを使用していたためMac環境では動作しなかったが、現在はMono.Data.sqliteを使用しているので簡単に使用することができる。

SQLiteの使用(不思議なお菓子)
https://sites.google.com/site/nrapmed/unityrepo/unisqlite

なお、System.Data.SQLiteはMac環境でないと動作しないと書いたが、実は.NET 2.0向けのSQLite 1.0.66.0では動作する。ただし、後述する問題点がMono.Data.sqliteと全く同じなので、問題解決には至らなかった。

■ファイルを配置する場所について

不思議なお菓子さんのサイトにあるファイルを設置するについての記述で、ビルド前は「Assetフォルダ上」ビルド後は「exeファイルの隣」となっているが、「StreamingAssets」フォルダに配置するほうが楽だと思う。(StreamingAssetsフォルダに配置したものは、ビルド後もそのままStreamingAssetsに配置される)
スクリーンショット 2012-09-16 13.14.37

その場合、アクセスURIはこんな風に設定する。

connectStr = "uri=file:" + Application.persistentDataPath + "/" + FilePath + ";";
SQLiteConnection con = new SQLiteConnection(connectStr);

ただし、確かモバイル環境だとStreamingAssetsのフォルダに配置したものは編集できないので、データを保存等するならApplication.persistentDataPathで設定したフォルダにコピーして使うのが無難じゃないかと思う。(PCやエディタ環境ならアクセス可)

[Unity3D] StreamingAssetsについて
http://terasur.blog.fc2.com/blog-entry-266.html

■問題点

この方法にはいくつか問題点がある。
まず一つ目は、不思議なお菓子さんでも指摘している通り「パスワードを設定することができない」点。パスワードを設定したdbを開こうとするとEntryPointNotFoundException: sqlite3_keyとエラーが起こり開くことができない。これはSystem.Data.SQLiteで動かす場合は起こらないらしいが、Mac環境ではSystem.Data.SQLiteが動かないので確認できなかった。

もう一つの問題は、iOSにビルドする際にSystemException: System.Net.Sockets are supported only on Unity iPhone Advanced. と表示されビルド出来ない事だ。(何故かAndroidだと問題なくビルドできた。どういう事なの…)



簡単にまとめると、こんな感じなんじゃないかと思う。

System.Data.SQLite(3.5向け)
 Windowsで動作する。パスワード設定可。モバイルは不明だがiOSは無理
System.Data.SQLite(2向け)
 Macで動作する。パスワードは設定できない。iOSは動作しない
Mono.Data.sqlite
 Macで動作する。パスワードは設定できない。iOSは動作しない

とりあえず、今回紹介する方法はモバイル向けに使う場合は色々と問題がありそうだが、PC特にWindows向けゲームを開発する場合に使用するライブラリをMono.Data.sqliteからSystem.Data.SQLiteに変更すれば大した問題にはならなそうだ。

iOS向けで動作するSQLiteについてはまた今度。