Udostępnij przez


Korzystanie z bazy danych SQLite w aplikacji UWP

Za pomocą narzędzia SQLite można przechowywać i pobierać dane w lekkiej bazie danych na urządzeniu użytkownika. W tym przewodniku pokazano, jak to zrobić.

Niektóre korzyści wynikające z używania biblioteki SQLite na potrzeby magazynu lokalnego

✔️ SQLite jest lekki i samodzielny. Jest to biblioteka kodu bez żadnych innych zależności. Nie ma nic do skonfigurowania.

✔️ Brak serwera bazy danych. Klient i serwer działają w tym samym procesie.

✔️ SqLite znajduje się w domenie publicznej, dzięki czemu możesz swobodnie korzystać z niej i rozpowszechniać ją z aplikacją.

✔️ SqLite działa na różnych platformach i architekturach.

Więcej informacji na temat SQLite można znaleźć tutaj.

Wybieranie warstwy abstrakcji

Zalecamy użycie platformy Entity Framework Core lub biblioteki open source SQLite skompilowanych przez firmę Microsoft.

Entity Framework Core (podstawowa wersja frameworka Entity)

Entity Framework (EF) to maper obiektowo-relacyjny, którego można użyć do pracy z danymi relacyjnymi przy użyciu obiektów specyficznych dla domeny. Jeśli ta struktura została już użyta do pracy z danymi w innych aplikacjach platformy .NET, możesz przeprowadzić migrację tego kodu do aplikacji platformy UWP i będzie działać z odpowiednimi zmianami w parametrach połączenia.

Aby wypróbować tę aplikację, zobacz Getting Started with EF Core(Wprowadzenie do programu EF Core).

Biblioteka SQLite

Biblioteka Microsoft.Data.Sqlite implementuje interfejsy w przestrzeni nazw System.Data.Common. Firma Microsoft aktywnie utrzymuje te implementacje i udostępnia intuicyjny wrapper dla natywnego interfejsu API SQLite niskiego poziomu.

Pozostała część tego przewodnika ułatwia korzystanie z tej biblioteki.

Konfigurowanie rozwiązania do korzystania z biblioteki Microsoft.Data.SQlite

Zaczniemy od podstawowego projektu platformy UWP, a następnie zainstalujemy odpowiednie pakiety Nuget.

Notatka

Upewnij się, że zainstalujesz Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core. Ten pakiet zainstaluje Microsoft.Data.Sqlite.Core jako zależność.

Wszystkie obsługiwane wersje systemu Windows obsługują bibliotekę SQLite, więc aplikacja nie musi pakować bibliotek SQLite. Zamiast tego aplikacja może używać wersji sqlite zainstalowanej z systemem Windows. Pomaga to na kilka sposobów.

✔️ Zmniejsza rozmiar aplikacji, ponieważ nie trzeba pobierać pliku binarnego SQLite, a następnie pakować go w ramach aplikacji.

✔️ Uniemożliwia konieczność wypuszczania nowej wersji aplikacji do użytkowników w przypadku, gdy SQLite publikuje krytyczne poprawki błędów i luk w zabezpieczeniach. Wersja SQLite systemu Windows jest obsługiwana przez firmę Microsoft we współpracy z SQLite.org.

✔️ Czas ładowania aplikacji może być szybszy, ponieważ najprawdopodobniej wersja zestawu SDK sqLite zostanie już załadowana do pamięci.

Zacznijmy od dodania klasy do projektu platformy UWP o nazwie DataAccess. Możesz użyć projektu biblioteki klas platformy .NET Standard, aby zawierać kod dostępu do danych, ale nie użyjemy go w naszym przykładzie.

Kliknij rozwiązanie prawym przyciskiem myszy, a następnie kliknij Zarządzaj pakietami NuGet dla rozwiązania.

Inny zrzut ekranu panelu Eksploratora rozwiązań z zaznaczoną opcją zarządzania pakietami NuGet po kliknięciu prawym przyciskiem myszy na projekt.

W tym momencie masz wybór. Możesz użyć wersji SQLite dołączonej do systemu Windows lub jeśli masz jakiś powód do korzystania z określonej wersji SQLite, możesz dołączyć bibliotekę SQLite do pakietu. Użyjemy wersji SQLite dołączonej do systemu Windows.

Wybierz kartę Przeglądaj, wyszukaj pakiet Microsoft.Data.SQLite.Core, a następnie zainstaluj najnowszą stabilną wersję.

pakietu SQLite Core

Dodawanie i pobieranie danych w bazie danych SQLite

Wykonamy następujące czynności:

1️⃣ Przygotowanie klasy dostępu do danych.

2️⃣ Inicjowanie bazy danych SQLite.

3️⃣ Wstaw dane do bazy danych SQLite.

4️⃣ Pobieranie danych z bazy danych SQLite.

5️⃣ Dodaj podstawowy interfejs użytkownika.

Przygotowywanie klasy dostępu do danych

Otwórz klasę DataAccess w projekcie i utwórz klasę statyczną.

Notatka

W naszym przykładzie kod dostępu do danych będzie umieszczany w klasie statycznej, ale jest to tylko wybór projektu i jest całkowicie opcjonalny.

public static class DataAccess
{

}

Dodaj następujące instrukcje using na początku tego pliku.

using Microsoft.Data.Sqlite;
using System.Collections.Generic;

Inicjowanie bazy danych SQLite

Dodaj metodę do klasy DataAccess, która inicjuje bazę danych SQLite.

public async static void InitializeDatabase()
{ 
     await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
     string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
     using (SqliteConnection db =
        new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        String tableCommand = "CREATE TABLE IF NOT " +
            "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
            "Text_Entry NVARCHAR(2048) NULL)";

        SqliteCommand createTable = new SqliteCommand(tableCommand, db);

        createTable.ExecuteReader();
    }
}

Ten kod tworzy bazę danych SQLite i przechowuje ją w lokalnym magazynie danych aplikacji.

W tym przykładzie nadajemy bazie danych nazwę sqlliteSample.db, ale możesz użyć dowolnej nazwy, o ile stosujesz tę nazwę we wszystkich obiektach SqliteConnection, które tworzysz.

W konstruktorze pliku App.xaml.cs projektu platformy UWP wywołaj metodę InitializeDatabase klasy DataAccess.

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;

    DataAccess.InitializeDatabase();
}

Wstawianie danych do bazy danych SQLite

Dodaj metodę do klasy DataAccess, która wstawia dane do bazy danych SQLite. Ten kod używa parametrów w zapytaniu, aby zapobiec atakom polegającym na wstrzyknięciu kodu SQL.

public static void AddData(string inputText)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
    using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        SQLitePCL.Batteries.Init();
        db.Open();

        SqliteCommand insertCommand = new SqliteCommand();
        insertCommand.Connection = db;

        // Use parameterized query to prevent SQL injection attacks
        insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
        insertCommand.Parameters.AddWithValue("@Entry", inputText);

        insertCommand.ExecuteReader();
    }

}

Pobieranie danych z bazy danych SQLite

Dodaj metodę, która pobiera wiersze danych z bazy danych SQLite.

public static List<String> GetData()
{
    List<String> entries = new List<string>();

   string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
   using (SqliteConnection db =
      new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        SqliteCommand selectCommand = new SqliteCommand
            ("SELECT Text_Entry from MyTable", db);

        SqliteDataReader query = selectCommand.ExecuteReader();

        while (query.Read())
        {
            entries.Add(query.GetString(0));
        }
    }

    return entries;
}

Metoda Read przechodzi przez wiersze zwracanych danych. Zwraca true, jeśli pozostały wiersze, w przeciwnym razie zwraca false.

Metoda GetString zwraca wartość określonej kolumny jako ciąg. Akceptuje wartość całkowitą reprezentującą indeks kolumny zaczynający się od zera, której dane chcesz uzyskać. Można użyć podobnych metod, takich jak GetDataTime i GetBoolean. Wybierz metodę na podstawie typu danych, które zawiera kolumna.

W tym przykładzie parametr porządkowy nie jest tak ważny, ponieważ wybieramy wszystkie wpisy w jednej kolumnie. Jeśli jednak wiele kolumn jest częścią zapytania, użyj wartości porządkowej, aby uzyskać kolumnę, z której chcesz ściągnąć dane.

Dodawanie podstawowego interfejsu użytkownika

W pliku MainPage.xaml projektu platformy UWP dodaj następujący kod XAML.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBox Name="Input_Box"></TextBox>
        <Button Click="AddData">Add</Button>
        <ListView Name="Output">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>
</Grid>

Ten podstawowy interfejs użytkownika daje użytkownikowi TextBox, za pomocą którego może wpisać ciąg, który dodamy do bazy danych SQLite. Połączymy Button w tym interfejsie użytkownika z programem obsługi zdarzeń, który pobierze dane z bazy danych SQLite, a następnie pokażemy te dane w ListView.

W pliku MainPage.xaml.cs dodaj następującą procedurę obsługi. To jest metoda, którą powiązaliśmy ze zdarzeniem Click związanym z Button w interfejsie użytkownika.

private void AddData(object sender, RoutedEventArgs e)
{
    DataAccess.AddData(Input_Box.Text);

    Output.ItemsSource = DataAccess.GetData();
}

Chcemy również upewnić się, że wszystkie istniejące dane są ładowane po uruchomieniu aplikacji. Dodaj wiersz kodu do konstruktora MainPage w celu wywołania GetData().

public MainPage()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

To wszystko. Zapoznaj się z Microsoft.Data.Sqlite, aby zobaczyć, jakie inne czynności można wykonać za pomocą bazy danych SQLite. Zapoznaj się z poniższymi linkami, aby dowiedzieć się więcej o innych sposobach używania danych w aplikacji platformy UWP.

Następne kroki

Łączenie aplikacji bezpośrednio z bazą danych programu SQL Server

Zobacz Używanie bazy danych SQL Server w aplikacji UWP.

Udostępnianie kodu między różnymi aplikacjami na różnych platformach

Zobacz Udostępnianie kodu między pulpitem a platformą UWP.

Dodawanie stron głównych ze szczegółami z bazą danych Azure SQL

Zobacz przykładową bazę danych zamówień klientów .