Konfigurace SQLite v Xamarin.iOS
Pokud chcete ve své aplikaci Xamarin.iOS použít SQLite, budete muset určit správné umístění souboru pro váš databázový soubor.
Cesta k souboru databáze
Bez ohledu na to, jakou metodu přístupu k datům používáte, musíte před uložením dat s nástrojem SQLite vytvořit soubor databáze. V závislosti na platformě, na kterou cílíte, se umístění souboru bude lišit. Pro iOS můžete použít třídu prostředí k vytvoření platné cesty, jak je znázorněno v následujícím fragmentu kódu:
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal),
"database.db3");
// dbPath contains a valid file path for the database file to be stored
Při rozhodování o tom, kam uložit soubor databáze, je potřeba vzít v úvahu i další věci. V iOSu můžete chtít, aby se databáze zálohovala automaticky (nebo ne).
Pokud chcete použít jiné umístění na každé platformě v aplikaci pro různé platformy, můžete použít direktivu kompilátoru, jak je znázorněno, abyste pro každou platformu vygenerovala jinou cestu:
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);
Další informace o umístěních souborů, která se mají v iOSu používat, najdete v článku Práce se systémem souborů. Další informace o použití direktiv kompilátoru k zápisu kódu specifického pro jednotlivé platformy najdete v dokumentu o vytváření multiplatformních aplikací .
Dělení na vlákna
Neměli byste používat stejné připojení databáze SQLite napříč několika vlákny. Dávejte pozor, abyste otevřeli, používali a zavřeli všechna připojení, která vytvoříte ve stejném vlákně.
Pokud chcete zajistit, aby se váš kód nepokoušl o přístup k databázi SQLite z více vláken najednou, ručně zamkněte, kdykoli budete mít přístup k databázi, například takto:
object locker = new object(); // class level private field
// rest of class code
lock (locker){
// Do your query or insert here
}
Veškerý přístup k databázi (čtení, zápisy, aktualizace atd.) by měl být zabalen se stejným zámkem. Je třeba dbát na to, aby se zabránilo zablokování tím, že zajistíte, aby práce uvnitř klauzule zámku byla jednoduchá a nevyvolá jiné metody, které mohou také vzít zámek!