niedziela, 19 marca 2017

XAMARIN i SQlite

Hej,
dzisiaj trochę o bazie danych w naszej konkursowej aplikacji - cóż to by była za aplikacja bez bazy, prawda? Przeglądając wszystkie xamarinowe tutoriale wybór wydaje się oczywisty: SQLite. Z takiego też rozwiązania korzystam, aczkolwiek gwoli ścisłości sposobów na przechowywania danych w xamarinie jest sporo - możemy równie dobrze dane parsować do jsona i korzystając z PCL Storage trzymać je w plikach. Ale ponieważ SQLite jest natywnie wspierany pod wszystkimi mobilnymi platformami, oraz korzystałem z niego wcześniej pisząc pod Adobe AIR nie zastanawiałem się długo nad wyborem. W internecie jest więcej niż jedna biblioteka tego bazodanowego silnika, ale najbardziej wypromowana i polecana jest sqlite-net-pcl wywodząca się z .netowej implementacji o nazwie sqlite.net.

Sam proces tworzenia naszej bazy jest dobrze opisany w internecie np tu : link.
Korzystanie jest proste i przyjemne jednak mamy pewne ograniczenia wynikające ze stosowania ORMa oraz z trochę okrojonego silnika. Po tych kilku latach używania SQLite nazbierało mi się kilka uwag i upierdliwych problemów:

  • Pod każdy interesujący nas wynik zapytania musimy zrobić osobną encje - nie można po prostu zrobić joina dwóch tabelek i dostać wyniku w postaci List<object>. Bardzo brakuje mi możliwości zwrócenia wyniku w postaci Hashtable, ExpandoObject lub w inny podobny sposób, który nie angażowałby mnie tak bardzo w pisanie encji. Korzystając z bazy w Adobe Air, w taki właśnie sposób działało zwracanie wyników - dostawaliśmy tablicę AS3.0 obiektów które zachowują się tak jak ExpandoObject w C#. 
  • Brak kluczy zewnętrznych - aczkolwiek znalazłem bibliotekę, która taką funkcjonalność oferuje (link) ale pewnie daje to spory narzut bo sam silnik takiej funkcjonalności nie posiada. 
  • ALTER TABLE obsługuje tylko ADD COLUMN - żadnej zmiany na istniejącej kolumnie nie wykonamy - nawet jej nie usuniemy. Trzeba się bawić w przenoszenie danych do tabelki tymczasowej, drop, nowy create itd.
  • Plik bazy ma tendencje do puchnięcia - polecam co jakiś czas wykonać VACUUM.
  • Error: database disk image is malformed - kto nigdy tego błędu nie widział ten może się uznać za szczęśliwca. Niestety mając kilka tysięcy urządzeń na produkcji raz na jakiś czas zdarza się, że w środowisku wystąpi błąd który plik bazy nieodwracalnie uszkadza (link). Dostęp do którejś z tabel jest wtedy niemożliwy, a resztę zwykle staram się odzyskać i w locie przerzucić do nowo utworzonej bazy. Bardzo irytujący błąd, którego nie potrafię wyeliminować.


Podsumowując - wybór silnika bazy danych był dla mnie prosty. Nie zawiodłem się na nim i polecam SQLite każdemu, kto potrzebuje skorzystać z relacyjnej bazy danych na urządzeniu mobilnym.



0 komentarze: