Použití SQLite.NET s Xamarin.iOS
Knihovna SQLite.NET, kterou Xamarin doporučuje, je základní ORM, která umožňuje ukládat a načítat objekty v místní databázi SQLite na zařízení s iOSem. 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.
Využití
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ů 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 SQLiteConnection. Nemusíte zkontrolovat, jestli soubor již existuje – v případě potřeby se automaticky vytvoří, jinak se otevře existující databázový soubor.
var db = new SQLiteConnection (dbPath);
Proměnná dbPath by měla být stanovena podle pravidel probíraných dříve v tomto dokumentu.
Uložit data – Po vytvoření objektu SQLiteConnection se databázové příkazy spustí voláním jeho metod, například 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í v iOSu takto. Kód ukazuje, jak provádět jednoduché operace SQLite.NET a zobrazuje výsledky jako text v hlavním okně aplikace.
iOS
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
To vyžaduje, abyste do projektu přidali SQLite, jak je zvýrazněno zde. 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ů nelze automaticky přeložit jako 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 vracející kolekce podporují IEnumerable<T> , 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);
}
Důležité
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 podprocesu, volání SqliteConnection.SetConfig
, které je v Mono.Data.Sqlite
oboru názvů. Tento řádek kódu například konfiguruje SQLite pro serializovaný režim:
using Mono.Data.Sqlite;
...
SqliteConnection.SetConfig(SQLiteConfig.Serialized);