在 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子句內的工作保持簡單,而且不會呼叫其他可能也採用鎖定的方法!