これは何ですか
SQLiteは、軽量で埋め込み型の完全に自己完結型のリレーショナルデータベースです。 これは最も一般的な SQLデータベースであり、世界中に少なくとも5億のインストールがあり、これは他のSQLデータベースの1億のデプロイメントと比較されます。 Mozilla Firefox、Chrome、Skype、Windows Phone 8、iOS、Android、Symbianなど、その他のプロジェクトで使用されています。そして最も重要なことは、無料のオープンソースであり、100%のテストカバレッジもあります。 これについては、公式のSQLite WebサイトおよびHaberの投稿で学ぶことができます。
なんで?
私たちの小さな部門では、ほぼ全員が異なるOSを使用しており、互換性が重要であるため、クロスプラットフォームソリューションを選択しようとしました。
私たちにとって、SQLiteは外部情報(リソース、構成設定、ローカリゼーション)を保存するための優れたオプションでした。 異なるデバイスへの転送、膨満感、速度低下の問題により、外部のXMLのようなファイルはすぐに拒否しました。 プロジェクトにSQLiteを使用することの適切性については、 こちらをご覧ください 。
どうやって?
データベースを作成および編集するために、 SQLite Managerを選択しました。これはFirefoxのプラグインであり、無料で、便利で、クロスプラットフォームです。 私が気に入らなかったのは、SQLクエリを追加して外部キーを追加するテーブルを作成する必要があったことと、複数のテーブルからコンパイルされたVIEWのレコードを編集できないことでした。 そして、残りは非常に明確です。 データベースへのSQLクエリを試すこともできます。 出力では、拡張子を自分で指定できるファイル(.db、.sqlite、.bytesなど)を取得しますが、Unityは「.bytes」のみを理解します。
もう一つの重要なポイント。 写真、音楽、ビデオの種類ごとにデータベースにバイナリを配置するのは悪い習慣です。 大まかに言うと、100 kbを超えるすべてのファイルはローカルフォルダーに配置し、データベースにはパスのみを記述します。 そうしないと、データベースからバイナリを読み込む速度がローカルで読み込むよりも速くなります 。
これらすべてをUnityプロジェクトに配置する時が来ました。 SQLiteを使用するには、 sqlite.dllライブラリ(Win、iOS、およびMacOS用)およびsqlite.os (Android用)をダウンロードします。 ここにライブラリを配置します
Assets/Plugins/sqlite.dll
および
Assets/Plugins/Android/sqlite.so
。
Plugins
パパがいない場合は、作成します。 作成されたデータベース(たとえば
db.bytes
と呼びます)は、
Assets/StreamingAssets
db.bytes
(存在しない場合は作成され
db.bytes
)に配置され
db.bytes
。 その結果、展開後、ベースは次のようになります。
WinおよびMac OS:
Application.dataPath + "/StreamingAssets/db.bytes"
iOS:
Application.dataPath + "/Raw/db.bytes"
ただし、Androidではapkアプリケーションファイルにパッケージ化されます。
"jar:file://" + Application.dataPath + "!/assets/db.bytes".
WWWクラスを使用してデータベースをロードし、 Application.persistentDataPath + "/"
フォルダーにコピーする必要があります。
ただし、これらのディレクトリには読み取り権限しかありません(Androidを除く)。データベースに何かを書き込む必要がある場合は、ここに移動する必要があります。
WinおよびMac OS:
Application.dataPath + "/db.bytes"
iOS:
string path = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf("/")); path = path.Substring(0, path.LastIndexOf("/")) + "/Documents/db.bytes";
かそこら
string path = Application.dataPath.Substring(0, Application.dataPath.length - 5); path = path.Substring(0, path.LastIndexOf("/")) + "/Documents/db.bytes";
かそこら
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) + "/db.bytes";
Androidについては上に書かれています。
次に、System.IOパッケージを接続して書き込みます
File.Copy(openPath, savePath);
それぞれAndroid向け
WWW www = new WWW(openPath); while(!www .isDone) {} // , File.WriteAllBytes(savePath, www.bytes);
さて、リソースバイナリ:モデル、ビデオ、音楽など、フォルダー
Assets/Resources/
入れます。 ビルド後、それらは
resources.assets
バイナリにパッケージ化されます。 そして、アプリケーションでそれらをロードします-Resources.Load(String path) 。 たとえば、サウンドを
Assets/Resources/Sounds/sound1.mp3
に格納し、データベースには
Sounds/sound1.mp3
というレコードがあり、アプリケーションでは次のようになります
AudioClip a = Resources.Load("Sounds/sound1.mp3") as AudioClip;
今こそ、データベースからデータを読み取るときです。 SQLクエリを作成して生データをオブジェクトに解析するのは好きではないので、 SQLite専用のSQLite-net ORMオープンソースプロジェクトを見つけました。これはオブジェクトリレーショナルマッピングライブラリです。 これは、データベースとオブジェクト指向プログラミングの概念を結び付ける技術です。 ここにはLinqのサポートがあります。たとえば、選択を行うことができます。
public class Favorite { [PrimaryKey, AutoIncrement] public int Id { get; set; } public int UserId { get; set; } public string Url { get; set; } } public Favorite[] GetFavorites(SQLiteConnection c, int id) { var q = from f in c.Table<Favorite>() where f.UserId == id select f; return q.ToArray(); }
または編集:
public void AddFavorite(SQLiteConnection c, string url, int id) { var fav = new Favorite() { UserId = id, Url = url }; c.Insert(fav); }
ただし、Linqは完全にはサポートされていません。たとえば、JOINはサポートされていないため、複雑なクエリの場合は、SQLコードを記述する必要があります。
ボーナスはどこにありますか?
まあ、原則として、私が書いた最も重要なこと。 今、約束されたボーナス。 プロジェクトでSQLiteを試して、ローカライズの問題を解決することをお勧めします。
データベースがあります:
表示、編集、作成するために、ローカライザー用の特別なツールを開発しました。これも投稿します(WinおよびMac OS用のAdobe Airビルド): link 。 がんばれ!
ご意見をお寄せいただきありがとうございます。