środa, 17 września 2014

Jak powinna wyglądać ergonomia pracy ze SQLite w Windows Phone 8!

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:
  1. 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.
  2. Klasa SQLiteCommand posiada kilka dodatkowych rozszerzeń, które umożliwiają wykonywanie poleceń SQL takich jak: SELECT, UPDATE, DELETE, INSERT na podstawie metadanych przekazanego obiektu.
  3. 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.
  4. 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.

Brak komentarzy:

Prześlij komentarz