Używanie SQLite.NET z platformą Xamarin.iOS

Biblioteka SQLite.NET zalecana przez platformę Xamarin to podstawowa biblioteka ORM, która umożliwia przechowywanie i pobieranie obiektów w lokalnej bazie danych SQLite na urządzeniu z systemem iOS. ORM to mapowanie relacyjne obiektów — interfejs API, który umożliwia zapisywanie i pobieranie "obiektów" z bazy danych bez konieczności pisania instrukcji SQL.

Użycie

Aby uwzględnić bibliotekę SQLite.NET w aplikacji platformy Xamarin, dodaj następujący pakiet NuGet do projektu:

SQLite.NET NuGet package

Dostępnych jest wiele różnych pakietów SQLite — upewnij się, że wybrano prawidłowy (może to nie być najlepszy wynik w wyszukiwaniu).

Ważne

SQLite.NET to biblioteka innej firmy obsługiwana przez repozytorium praeclarum/sqlite-net.

Po udostępnieniu biblioteki SQLite.NET wykonaj następujące trzy kroki, aby uzyskać do niej dostęp do bazy danych:

  1. Dodaj instrukcję using — dodaj następującą instrukcję do plików języka C#, w których wymagany jest dostęp do danych:

    using SQLite;
    
  2. Utwórz pustą bazę danych — odwołanie do bazy danych można utworzyć, przekazując ścieżkę pliku konstruktora klasy SQLite Połączenie ion. Nie musisz sprawdzać, czy plik już istnieje — zostanie on utworzony automatycznie, jeśli jest to wymagane, w przeciwnym razie istniejący plik bazy danych zostanie otwarty.

    var db = new SQLiteConnection (dbPath);
    

    Zmienna dbPath powinna być określana zgodnie z regułami omówionymi wcześniej w tym dokumencie.

  3. Zapisywanie danych — po utworzeniu obiektu SQLite Połączenie ion polecenia bazy danych są wykonywane przez wywołanie jego metod, takich jak CreateTable i Insert w następujący sposób:

    db.CreateTable<Stock> ();
    db.Insert (newStock); // after creating the newStock object
    
  4. Pobieranie danych — aby pobrać obiekt (lub listę obiektów), użyj następującej składni:

    var stock = db.Get<Stock>(5); // primary key id of 5
    var stockList = db.Table<Stock>();
    

Przykład podstawowego dostępu do danych

Przykładowy kod DataAccess_Basic dla tego dokumentu wygląda następująco podczas uruchamiania w systemie iOS. Kod ilustruje sposób wykonywania prostych operacji SQLite.NET i przedstawia wyniki w postaci tekstu w oknie głównym aplikacji.

iOS

iOS SQLite.NET sample

Poniższy przykładowy kod przedstawia całą interakcję z bazą danych przy użyciu biblioteki SQLite.NET w celu hermetyzacji dostępu do bazowej bazy danych. Pokazuje on:

  1. Tworzenie pliku bazy danych
  2. Wstawianie niektórych danych przez utworzenie obiektów, a następnie zapisanie ich
  3. Wykonywanie zapytań dotyczących danych

Należy uwzględnić następujące przestrzenie nazw:

using SQLite; // from the github SQLite.cs class

Wymaga to dodania sqlite do projektu, jak wyróżniono tutaj. Należy pamiętać, że tabela bazy danych SQLite jest definiowana przez dodanie atrybutów do klasy ( Stock klasy) zamiast polecenia 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);
    }
}

Użycie atrybutu [Table] bez określenia parametru nazwy tabeli spowoduje, że podstawowa tabela bazy danych będzie mieć taką samą nazwę jak klasa (w tym przypadku "Stock"). Rzeczywista nazwa tabeli jest ważna, jeśli zapytania SQL są zapisywane bezpośrednio w bazie danych, a nie przy użyciu metod dostępu do danych ORM. [Column("_id")] Podobnie atrybut jest opcjonalny, a jeśli nie ma kolumny, zostanie dodana do tabeli o takiej samej nazwie jak właściwość w klasie.

Atrybuty SQLite

Typowe atrybuty, które można zastosować do klas w celu kontrolowania sposobu ich przechowywania w bazowej bazie danych, obejmują:

  • [PrimaryKey] — Ten atrybut można zastosować do właściwości całkowitej, aby wymusić na niej klucz podstawowy tabeli bazowej. Złożone klucze podstawowe nie są obsługiwane.
  • [AutoInkrementacja] — Ten atrybut spowoduje, że wartość właściwości całkowitej będzie automatycznie zwiększana dla każdego nowego obiektu wstawionego do bazy danych
  • [Column(name)] — Parametr name ustawia nazwę bazowej kolumny bazy danych.
  • [Table(name)] — oznacza klasę jako możliwość przechowywania w bazowej tabeli SQLite o określonej nazwie.
  • [MaxLength(wartość)] — ogranicz długość właściwości tekstowej, gdy próba wstawienia bazy danych jest podejmowana. Użycie kodu powinno sprawdzić to przed wstawieniem obiektu, ponieważ ten atrybut jest sprawdzany tylko podczas próby wstawiania lub aktualizowania bazy danych.
  • [Ignoruj] — Powoduje, że SQLite.NET ignorować tę właściwość. Jest to szczególnie przydatne w przypadku właściwości, które mają typ, którego nie można przechowywać w bazie danych lub właściwości, których kolekcje modelu nie mogą być automatycznie rozpoznawane jako SQLite.
  • [Unikatowe] — Gwarantuje, że wartości w bazowej kolumnie bazy danych są unikatowe.

Większość z tych atrybutów jest opcjonalna. Zawsze należy określić klucz podstawowy liczby całkowitej, aby zapytania dotyczące wybierania i usuwania mogły być wykonywane wydajnie na danych.

Bardziej złożone zapytania

Do wykonywania innych operacji danych można użyć następujących metod SQLiteConnection :

  • Insert — dodaje nowy obiekt do bazy danych.
  • Get<T> — próbuje pobrać obiekt przy użyciu klucza podstawowego.
  • Tabela<T> — zwraca wszystkie obiekty w tabeli.
  • Delete — usuwa obiekt przy użyciu jego klucza podstawowego.
  • Zapytanie<T> — wykonaj zapytanie SQL zwracające liczbę wierszy (jako obiekty).
  • Execute — użyj tej metody (a nie Query ), jeśli nie oczekujesz wierszy z powrotem z bazy danych SQL (takich jak instrukcje INSERT, UPDATE i DELETE).

Pobieranie obiektu za pomocą klucza podstawowego

SQLite.Net udostępnia metodę Get w celu pobrania pojedynczego obiektu na podstawie klucza podstawowego.

var existingItem = db.Get<Stock>(3);

Wybieranie obiektu przy użyciu linq

Metody zwracające kolekcje obsługują IEnumerable<T> , dzięki czemu można użyć linq do wykonywania zapytań lub sortowania zawartości tabeli. Poniższy kod przedstawia przykład użycia linq do odfiltrowania wszystkich wpisów rozpoczynających się literą "A":

var apple = from s in db.Table<Stock>()
    where s.Symbol.StartsWith ("A")
    select s;
Console.WriteLine ("-> " + apple.FirstOrDefault ().Symbol);

Wybieranie obiektu przy użyciu języka SQL

Mimo że SQLite.Net może zapewnić dostęp oparty na obiektach do danych, czasami może być konieczne wykonanie bardziej złożonego zapytania niż zezwala linq (lub może być potrzebna szybsza wydajność). Polecenia SQL można używać z metodą Query, jak pokazano poniżej:

var stocksStartingWithA = db.Query<Stock>("SELECT * FROM Items WHERE Symbol = ?", "A");
foreach (var s in stocksStartingWithA) {
    Console.WriteLine ("a " + s.Symbol);
}

Ważne

Podczas pisania instrukcji SQL bezpośrednio tworzysz zależność od nazw tabel i kolumn w bazie danych, które zostały wygenerowane na podstawie klas i ich atrybutów. Jeśli zmienisz te nazwy w kodzie, pamiętaj, aby zaktualizować wszelkie ręcznie napisane instrukcje SQL.

Usuwanie obiektu

Klucz podstawowy służy do usuwania wiersza, jak pokazano poniżej:

var rowcount = db.Delete<Stock>(someStock.Id); // Id is the primary key

Możesz sprawdzić wartość , rowcount aby potwierdzić, ile wierszy zostało dotkniętych (usuniętych w tym przypadku).

Używanie SQLite.NET z wieloma wątkami

SqLite obsługuje trzy różne tryby wątkowania: jednowątkowy, wielowątkowy i serializowany. Jeśli chcesz uzyskać dostęp do bazy danych z wielu wątków bez żadnych ograniczeń, możesz skonfigurować bibliotekę SQLite do korzystania z trybu wątkowania serializowanego. Ważne jest, aby ustawić ten tryb na wczesnym etapie aplikacji (na przykład na początku OnCreate metody).

Aby zmienić tryb wątkowania, wywołaj SqliteConnection.SetConfig metodę Mono.Data.Sqlite , która znajduje się w przestrzeni nazw. Na przykład ten wiersz kodu konfiguruje sqlite dla trybu serializowanego :

using Mono.Data.Sqlite;
...
SqliteConnection.SetConfig(SQLiteConfig.Serialized);