Wymagania
Visual Studio: 2012
SQLite for Windows Phone: 3.8.6
Warsztat narzędzi oraz wygoda ich używania dla programistów jest najważniejszą kwestią w codziennej pracy zawodowej. W rzeczywistości deweloperzy mogą wskazywać kierunek i nakreślić użyteczność różnych rozwiązań technologicznych - w dużym stopniu. Wspominam o tym bo zdarza się, że producenci wprowadzając na rynek nowe rozwiązania czasami o tym zapominają. Każdy z programistów pamięta początki i ile potu wylał na klawiaturę zanim ujarzmił bazę danych w systemie Windows Phone 8. Osobiście byłem rozczarowany faktem, że Microsoft zablokował bezpośredni dostęp do bazy danych SQL Server Compact, pozostawiając nam jedynie do dyspozycji LINQ. W rezultacie zniknęły nam z oczu najważniejsze przestrzenie dla sektora biznesowego: System.Data.SqlServerCe i System.Data.SqlClient. Zwracam uwagę na wyraz "zniknęły", ponieważ defakto składowe z przestrzeni System.Data.SqlServerCe zmieniły tylko lokalizację i modyfikator dostępu! Dla zainteresowanych podam, że wszystkie składowe z przestrzeni System.Data.SqlServerCe, do których od lat przyzwyczajeni byli programiści znajdują się teraz w bibliotece Microsoft.Phone.Data.Internal.dll.
Okiełznanie bazy SQLite w systemie mobilnym Windows Phone 8
Temat ujarzmienia bazy danych SQLite został już przez
większość z nas opanowany dzięki wytrwałej społeczności. Napisano na ten temat
kilka dobrych artykułów, do których podaję linki i nie będę się w temat
wgłębiał.
Linki:
Working
with SQLite in Windows Phone 8: a sqlite-net version for mobileErgonomia pracy z bazą danych SQLite w systemie Windows Phone 8
Mówiąc o wygodzie pracy trzeba zaznaczyć, że powstało kilka
rozwiązań. Jednym z najlepszych narzędzi będzie opcja pobierania potrzebnych
bibliotek bezpośrednio ze środowiska Visual Studio poprzez klienta NuGet. Inna
opcja to ręczne pobranie bibliotek SQLite ze strony: http://www.sqlite.org/download.html#wp8
Mnogość bibliotek może na początku sprawiać trudności w
odpowiednim ich doborze w zależności od tego na jakim systemie operacyjnym
będziemy uruchamiać nasze aplikacje. Jeśli ograniczamy się do systemu Windows
Phone 8 to poruszamy się w obrębie architektury ARM i tutaj mamy do wyboru tak
naprawdę niewiele. Istnieje biblioteka System.Data.SQLite, której
funkcjonalność zapewnia swobodną pracę, jednak nie jest ona przeznaczona dla
systemu Windows Phone 8. To co obecnie dostępne jest dla systemu mobilnego, są
to niestety moim zdaniem tylko i wyłącznie "zaślepki", które nie
zapewniają wygody i ergonomii pracy.
Uzupełnienie braków
Przedstawiam tu propozycję rozwiązania, czyli
uzupełnienie braków i wyciągnięcie niektórych części kodu na światło dzienne. Projekt,
który udostępniam zawiera rozwiązania zaczerpnięte ze źródeł biblioteki
System.Data.SQLite (link powyżej) i kodów źródłowych .NET.
Link do kodów źródłowych .NET
Z racji ograniczeń licencji kodów źródłowych .NET projekt
przedstawiam jako poglądowe rozwiązanie, które obrazuje jakie można uzyskać
możliwości. Poniżej dla zobrazowania zamieszczam skróconą listę "odzyskanych" przestrzeni
nazw i składowych. Link do projektu zamieszczony jest na początku opracowania.
Skrócona lista
"odzyskanych" składowych:
System.Data.Linq.SqlClient.SqlFactory
System.Data.Linq.SqlClient.SQLiteBuilder
System.Data.Linq.SQLiteDataContext
Methods:
public
string GetQueryText(Expression query)
public
string GetQueryText(Expression query, out DbParameter[] parameters)
public
DbCommand GetCommand(IQueryable query)
public
DbCommand GetCommand(Expression query)
public
DbCommand GetCommand(Expression query, DbConnection connection)
public
int ExecuteCommand(string command)
public
int ExecuteCommand(string command, params object[] parameters)
public
IEnumerable<TResult> ExecuteQuery<TResult>(string query)
public
IEnumerable<TResult> ExecuteQuery<TResult>(string query, params object[]
parameters)
public
IEnumerable ExecuteQuery(Type elementType, string query, params object[]
parameters)
public
IEnumerable<TResult> Translate<TResult>(DbDataReader reader)
public
IEnumerable Translate(Type elementType, DbDataReader reader)
public
IMultipleResults Translate(DbDataReader reader)
...
System.Data.SQLite.SQLiteCommand
System.Data.SQLite.SQLiteConnection
System.Data.SQLite.SQLiteDataAdapter
System.Data.SQLite.SQLiteDataReader
System.Data.SQLite.SQLiteParameter
System.Data.SQLite.SQLiteTransaction
...
System.Data.DataRelation
System.Data.DataRow
System.Data.DataSet
System.Data.DataTable
System.Data.DataView
...
Projekt System - ogólne informacje
Biblioteka System
zbiera w jednym miejscu sporo brakujących składowych tj. klasy dostępu do bazy
danych SQLite, kolekcji, typów danych itp. Otrzymujemy funkcjonalność LINQ +
SQLite, klasy DataSet, DataTable i wiele innych.
Kilka wskazówek:
- LINQ to SQL Class – utworzone klasy w standardowym projekcie desktopowym możemy przenosić do projektu Windows Phone 8. Wszystkie wygenerowane składowe typu System.Data.Linq.Table w pliku *.designer należy zmienić na System.Data.Linq.TableEntity. W projekcie desktopowym wygenerowana klasa kontekstu dziedziczy po klasie System.Data.Linq.DataContext, natomiast w projekcie mobilnym musi dziedziczyć po System.Data.Linq.SQLiteDataContext.
- Klasa SQLiteCommand posiada kilka dodatkowych rozszerzeń, które umożliwiają wykonywanie poleceń SQL takich jak: SELECT, UPDATE, DELETE, INSERT na podstawie metadanych przekazanego obiektu.
- Klasa System.Data.Linq.SQLiteDataContext dziedziczy po standardowej klasie dostępnej w .NET System.Data.Linq.DataContext ale ma większe możliwości zaczerpnięte z wersji desktopowej. Umożliwia wykonywanie poleceń SQL z poziomu LINQ, translację wyniku zapytania SQL na wskazany typ obiektu itp.
- Do rozwiązania załączono projekt z przykładami wykorzystania bazy danych SQLite + LINQ oraz klas z przestrzeni System.Data.SQLite. Pokazano wiele wariantów i możliwości projektowych.
Projekt Sqlite - Runtime Component (Wrapper)
Aby wszystko powyższe było możliwe została rozszerzona
funkcjonalność komponentu Sqlite. Obecnie biblioteka implementuje ponad setkę wymaganych funkcji.