Použití SQLite.NET s Androidem
Knihovna SQLite.NET, kterou Xamarin doporučuje, je velmi základní ORM, která umožňuje snadno ukládat a načítat objekty v místní databázi SQLite na zařízení s Androidem. ORM je zkratka pro objektové relační mapování – rozhraní API, které umožňuje ukládat a načítat "objekty" z databáze bez psaní příkazů SQL.
Pokud chcete do aplikace Xamarin zahrnout knihovnu SQLite.NET, přidejte do projektu následující balíček NuGet:
- Název balíčku: sqlite-net-pcl
- Autor: Frank A. Krueger
- ID: sqlite-net-pcl
- Adresa URL:nuget.org/packages/sqlite-net-pcl
K dispozici je několik různých balíčků SQLite – nezapomeňte zvolit ten správný (nemusí se jednat o nejlepší výsledek hledání).
Důležité
SQLite.NET je knihovna třetí strany podporovaná z úložiště praeclarum/sqlite-net.
Jakmile budete mít k dispozici SQLite.NET knihovnu, použijte ji pomocí těchto tří kroků pro přístup k databázi:
Přidejte příkaz using – přidejte následující příkaz do souborů jazyka C#, kde je vyžadován přístup k datům:
using SQLite;
Vytvoření prázdné databáze – odkaz na databázi lze vytvořit předáním cesty k souboru konstruktoru třídy SQLite Připojení ion. Nemusíte zkontrolovat, jestli soubor již existuje – v případě potřeby se automaticky vytvoří, jinak se otevře existující databázový soubor. Proměnná
dbPath
by měla být stanovena podle pravidel probíraných výše v tomto dokumentu:var db = new SQLiteConnection (dbPath);
Uložit data – Po vytvoření objektu SQLite Připojení ion se databázové příkazy spustí voláním jeho metod, jako je CreateTable a Insert takto:
db.CreateTable<Stock> (); db.Insert (newStock); // after creating the newStock object
Načtení dat – k načtení objektu (nebo seznamu objektů) použijte následující syntaxi:
var stock = db.Get<Stock>(5); // primary key id of 5 var stockList = db.Table<Stock>();
Ukázka základního přístupu k datům
Ukázkový kód DataAccess_Basic pro tento dokument vypadá při spuštění na Androidu takto. Kód ukazuje, jak provádět jednoduché operace SQLite.NET a zobrazuje výsledky jako text v hlavním okně aplikace.
Android
Následující ukázka kódu ukazuje celou interakci databáze pomocí knihovny SQLite.NET k zapouzdření základního přístupu k databázi. Zobrazuje se:
Vytvoření souboru databáze
Vložení některých dat vytvořením objektů a jejich uložením
Dotazování na data
Budete muset zahrnout tyto obory názvů:
using SQLite; // from the github SQLite.cs class
Poslední vyžaduje, abyste do projektu přidali SQLite. Všimněte si, že tabulka databáze SQLite je definována přidáním atributů do třídy ( Stock
třída) místo příkazu CREATE TABLE.
[Table("Items")]
public class Stock {
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(8)]
public string Symbol { get; set; }
}
public static void DoSomeDataAccess () {
Console.WriteLine ("Creating database, if it doesn't already exist");
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal),
"ormdemo.db3");
var db = new SQLiteConnection (dbPath);
db.CreateTable<Stock> ();
if (db.Table<Stock> ().Count() == 0) {
// only insert the data if it doesn't already exist
var newStock = new Stock ();
newStock.Symbol = "AAPL";
db.Insert (newStock);
newStock = new Stock ();
newStock.Symbol = "GOOG";
db.Insert (newStock);
newStock = new Stock ();
newStock.Symbol = "MSFT";
db.Insert (newStock);
}
Console.WriteLine("Reading data");
var table = db.Table<Stock> ();
foreach (var s in table) {
Console.WriteLine (s.Id + " " + s.Symbol);
}
}
Použití atributu [Table]
bez zadání parametru názvu tabulky způsobí, že podkladová tabulka databáze bude mít stejný název jako třída (v tomto případě "Stock"). Skutečný název tabulky je důležitý, pokud místo použití metod přístupu k datům ORM zapisujete dotazy SQL přímo do databáze. [Column("_id")]
Podobně je atribut volitelný a pokud chybí sloupec, bude přidán do tabulky se stejným názvem jako vlastnost ve třídě.
Atributy SQLite
Mezi běžné atributy, které můžete použít u tříd, abyste mohli řídit, jak jsou uloženy v podkladové databázi, patří:
[PrimaryKey] – Tento atribut lze použít na celočíselnou vlastnost, aby byla primárním klíčem podkladové tabulky. Složené primární klíče nejsou podporovány.
[AutoIncrement] – Tento atribut způsobí, že hodnota celočíselné vlastnosti se automaticky zvýší pro každý nový objekt vložený do databáze.
[Sloupec(název)] – Parametr
name
nastaví název základního databázového sloupce.[Table(name)] – Označí třídu jako možnou uloženou v podkladové tabulce SQLite se zadaným názvem.
[MaxLength(value)] – Omezte délku textové vlastnosti při pokusu o vložení databáze. Používání kódu by mělo před vložením objektu ověřit, protože tento atribut je při pokusu o vložení nebo aktualizaci databáze pouze zaškrtnuté.
[Ignorovat] – Způsobí, SQLite.NET ignorovat tuto vlastnost. To je zvlášť užitečné pro vlastnosti, které mají typ, který nelze uložit v databázi, nebo vlastnosti, které kolekce modelů, které nelze automaticky přeložit pomocí SQLite.
[Jedinečné] – Zajišťuje, aby hodnoty v podkladovém databázovém sloupci byly jedinečné.
Většina těchto atributů je nepovinná. Vždy byste měli zadat celočíselnou primární klíč, aby bylo možné efektivně provádět výběrové a odstraněné dotazy na vaše data.
Složitější dotazy
K provádění dalších operací s daty je možné použít následující metody SQLiteConnection
:
Vložení – přidá do databáze nový objekt.
Get<T> – Pokusí se načíst objekt pomocí primárního klíče.
Table<T> – Vrátí všechny objekty v tabulce.
Delete – Odstraní objekt pomocí svého primárního klíče.
Dotaz<T> – Proveďte dotaz SQL, který vrací počet řádků (jako objekty).
Execute – Použijte tuto metodu (a ne
Query
) v případě, že neočekáváte řádky zpět z SQL (například INSERT, UPDATE a DELETE pokyny).
Získání objektu podle primárního klíče
SQLite.Net poskytuje metodu Get pro načtení jednoho objektu na základě jeho primárního klíče.
var existingItem = db.Get<Stock>(3);
Výběr objektu pomocí Linqu
Metody, které vracejí podporu IEnumerable<T>
kolekcí, abyste mohli pomocí Linq dotazovat nebo řadit obsah tabulky. Následující kód ukazuje příklad použití Linq k vyfiltrovat všechny položky, které začínají písmenem "A":
var apple = from s in db.Table<Stock>()
where s.Symbol.StartsWith ("A")
select s;
Console.WriteLine ("-> " + apple.FirstOrDefault ().Symbol);
Výběr objektu pomocí SQL
I když SQLite.Net může poskytnout objektový přístup k datům, může být někdy potřeba udělat složitější dotaz, než umožňuje Linq (nebo možná potřebujete rychlejší výkon). Příkazy SQL můžete použít s metodou Query, jak je znázorněno tady:
var stocksStartingWithA = db.Query<Stock>("SELECT * FROM Items WHERE Symbol = ?", "A");
foreach (var s in stocksStartingWithA) {
Console.WriteLine ("a " + s.Symbol);
}
Poznámka:
Při psaní příkazů SQL přímo vytvoříte závislost na názvech tabulek a sloupců v databázi, které byly generovány z vašich tříd a jejich atributů. Pokud tyto názvy změníte v kódu, nezapomeňte aktualizovat všechny ručně napsané příkazy SQL.
Odstranění objektu
Primární klíč slouží k odstranění řádku, jak je znázorněno tady:
var rowcount = db.Delete<Stock>(someStock.Id); // Id is the primary key
Můžete zkontrolovat rowcount
, kolik řádků se to týká (v tomto případě odstraněno).
Použití SQLite.NET s více vlákny
SQLite podporuje tři různé režimy vláken: jednovláknové, vícevláknové a serializované. Pokud chcete získat přístup k databázi z více vláken bez jakýchkoli omezení, můžete SQLite nakonfigurovat tak, aby používal režim serializovaného podprocesu. Tento režim je důležité nastavit v rané fázi aplikace (například na začátku OnCreate
metody).
Chcete-li změnit režim vláken, zavolejte SqliteConnection.SetConfig
. Tento řádek kódu například konfiguruje SQLite pro serializovaný režim:
using using Mono.Data.Sqlite;
...
SqliteConnection.SetConfig(SQLiteConfig.Serialized);
Verze SQLite pro Android má omezení, které vyžaduje několik dalších kroků. Pokud volání SqliteConnection.SetConfig
vytvoří výjimku SQLite, například library used incorrectly
, musíte použít následující alternativní řešení:
Propojte nativní knihovnu libsqlite.so , aby
sqlite3_shutdown
sqlite3_initialize
byla pro aplikaci dostupná rozhraní API:[DllImport("libsqlite.so")] internal static extern int sqlite3_shutdown(); [DllImport("libsqlite.so")] internal static extern int sqlite3_initialize();
Na začátku
OnCreate
metody přidejte tento kód pro vypnutí SQLite, nakonfigurujte ho pro serializovaný režim a znovu inicializovat SQLite:using using Mono.Data.Sqlite; ... sqlite3_shutdown(); SqliteConnection.SetConfig(SQLiteConfig.Serialized); sqlite3_initialize();
Toto alternativní řešení funguje také pro knihovnu Mono.Data.Sqlite
. Další informace o SQLite a více vláknech naleznete v tématu SQLite a Více vláken.