Baza danych w poważniejszych aplikacjach na Windows 8 to podstawa — niezależnie, czy budujemy małą aplikację do zapisywania obrazków czy dużą aplikację działającą z Windows Azure, gdzie relacje między danymi to podstawa albo potrzebny nam caching danych.
Ponieważ nie ma komponentów baz danych SQL CE, które można by dołączyć do naszych projektów w środowisku Windows Runtime, Microsoft wraz z ludźmi z SQLite przygotował nam alternatywę w postaci tego bardzo ciekawego i szybkiego systemu bazy danych. Napisany jest on w natywnym C++, skompilowany do środowiska WinRT i działa z każdą architekturą na którą programujemy.
Instalacja paczki SQLite dla Windows Runtime
Pierwszą rzeczą, którą należy uczynić jest ściągnięcie paczki z bazą danych. Można to zrobić z poziomu Visual Studio (we wszystkich edycjach). Z menu Tools wybieramy Extensions and Updates, następnie wybieramy sekcję Online i wpisujemy w wyszukiwarce “sqlite”. Wtedy ukaże się nam paczka: SQLite for Windows Runtime.
Klikamy Download i instalujemy. Po zainstalowaniu należy zrestartować Visual Studio.
Używanie SQLite w projektach XAML/C# (VB)
Kiedy mamy już paczkę SQLite dla Windows Runtime, możemy jej użyć:
- Stwórz aplikację (np. pusta Aplikacja)
- Wywołaj opcję Add Reference
- Dodajemy rozszerzenie z kategorii Windows/Extensions: SQLite for Windows Runtime wraz z C++ Runtime Package
Ponieważ biblioteka ta jest napisana w C++, najwygodniej jest ściągnąć wrapper — zbiór klas/funkcji pomocniczych napisanych w C# wywołujących funkcje C++. Najłatwiejszą biblioteką jest sqlite-net , dostępna przez NuGet:
Install-Package sqlite-net
Po instalacji pojawią się 2 pliki: SQLiteAsync.cs oraz SQLite.cs.
Przykład użycia:
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
LoadData();
}
public void LoadData()
{
var dbPath = Path.Combine(
Windows.Storage.ApplicationData.Current.LocalFolder.Path,
"db.sqlite");
using (var db = new SQLite.SQLiteConnection(dbPath))
{
db.CreateTable<Person>();
db.RunInTransaction(() =>
{
db.Insert(new Person() { FirstName = "Tim", LastName = "Heuer" });
db.Insert(new Person() { FirstName = "Michał", LastName = "Walczak" });
});
}
}
}
public class Person
{
[SQLite.AutoIncrement, SQLite.PrimaryKey]
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Używanie SQLite w projektach XAML/C++
Deweloperzy piszący w C++ muszą zainstalować paczkę i dodać ją do referencji. W projektach C++ trzeba manualnie wybrać References, wtedy dopiero przycisk Add Reference pojawia się. Aby zacząć korzystać z SQLite należy dodać include:
#include <sqlite3.h>
Nie trzeba korzystać z wrapperów, ponieważ cała baza napisana jest w C++.
Używanie SQLite w projektach HTML5/Javascript
Należy podążać takimi samymi krokami jak w przypadku XAML/C#. Zalecanym wrapperem jest SQLite3-WinRT :
var dbPath = Windows.Storage.ApplicationData.current.localFolder.path + '\\db.sqlite';
SQLite3JS.openAsync(dbPath)
.then(function (db) {
return db.runAsync(
'CREATE TABLE Item (name TEXT, price REAL, id INT PRIMARY KEY)'
);
})
.then(function (db) {
return db.runAsync(
'INSERT INTO Item (name, price, id) VALUES (?, ?, ?)',
['Mango', 4.6, 123]
);
})
.then(function (db) {
return db.eachAsync('SELECT * FROM Item', function (row) {
console.log('Get a ' + row.name + ' for $' + row.price);
});
})
.then(function (db) {
db.close();
});
Podsumowanie
SQLite to bardzo prosta w obsłudze, lecz zaawansowana baza danych — napisana jest w C++, działa na plikach lokalnych.
Uwaga! Testowane wersje SQLite (do 3.7.13) posiadają irytujący błąd. Ponieważ SQLite wykorzystuje do zapisu przestrzeń lokalną (Local Storage), korzysta ze ścieżki bezpośredniej. Jeżeli wasza nazwa użytkownika zawiera polskie litery lub litery z rozszerzonej tablicy ASCII, SQLite nie będzie w stanie stworzyć pliku bazy danych. Jedynym obejściem jest stworzenie konta lokalnego nie zawierającego w nazwie polskich znaków.
Artykuł oparty na materiale Tima Heuera .