Link do projektu: TestSqlite.rar
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 mobile
Ergonomia 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.