Sdílet prostřednictvím


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:

balíček NuGet SQLite.NET

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ů 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 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.

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

Ukázka SQLite.NET 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:

  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

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);