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:

SQLite.NET NuGet package

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:

  1. 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;
    
  2. 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);
    
  3. 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
    
  4. 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

Android SQLite.NET sample

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:

  1. Vytvoření souboru databáze

  2. Vložení některých dat vytvořením objektů a jejich uložením

  3. 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í:

  1. Propojte nativní knihovnu libsqlite.so , aby sqlite3_shutdownsqlite3_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();
    
  2. 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.