Xamarin.iOS での SQLite の構成

Xamarin.iOS アプリケーションで SQLite を使用するには、データベース ファイルの正しいファイルの場所を決定する必要があります。

データベース ファイル パス

使用するデータ アクセス方法に関係なく、SQLite でデータを保存するには、事前にデータベース ファイルを作成する必要があります。 対象とするプラットフォームによって、ファイルの場所が異なります。 iOS の場合、次のコード スニペットに示すように、Environment クラスを使用して有効なパスを構築できます。

string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "database.db3");
// dbPath contains a valid file path for the database file to be stored

データベース ファイルを保存する場所を決定する際に考慮すべき点は他にもあります。 iOS では、データベースを自動的にバックアップする (またはしない) ことが必要な場合があります。

クロス プラットフォーム アプリケーション内のプラットフォームごとに異なる場所を使用する場合は、次のようにコンパイラ ディレクティブを使って、プラットフォームごとに異なるパスを生成できます。

var sqliteFilename = "MyDatabase.db3";
#if __ANDROID__
// Just use whatever directory SpecialFolder.Personal returns
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
#else
// we need to put in /Library/ on iOS5.1+ to meet Apple's iCloud terms
// (they don't want non-user-generated data in Documents)
string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder instead
#endif
var path = Path.Combine (libraryPath, sqliteFilename);

iOS で使用するファイルの場所の詳細については、ファイル システムの操作に関する記事を参照してください。 コンパイラ ディレクティブを使用して各プラットフォームに固有のコードを記述する方法の詳細については、「クロスプラットフォーム アプリケーションの構築」のドキュメントを参照してください。

スレッド化

複数のスレッド間で同じ SQLite データベース接続を使用しないでください。 同じスレッドで作成した接続を開き、使用したら閉じるよう注意してください。

コードが複数のスレッドから SQLite データベースに同時にアクセスしないようにするには、次のように、データベースにアクセスするたびに手動でロックします。

object locker = new object(); // class level private field
// rest of class code
lock (locker){
    // Do your query or insert here
}

すべてのデータベース アクセス (読み取り、書き込み、更新など) は、同じロックでラップする必要があります。 lock 句内の作業を単純に保ち、ロックする可能性のある他のメソッドを呼び出さないようにして、デッドロックの状況を回避するよう注意する必要があります。