Xamarin – Android i SQLite

W pewnym momencie przychodzi taki moment, że chcemy pozbyć się testowych danych i zacząć przechowywać faktyczne wpisy użytkownika. Jako że operujemy na telefonach – nie mamy tutaj do dyspozycji standardowych rozwiązań typu serwer MS SQL czy PostgreSQL.

Aktualnie widzę tu trzy możliwości:

  1. Web API
  2. Plik XML lub json
  3. Lokalna baza danych

Z pierwszej absolutnie nie chcę korzystać. Tworzę małą aplikację, która jest dostępna wyłącznie na telefonie. Dotychczas nie potrzebowała ona używać Internetu, dlatego bez sensu byłoby wprowadzenie wymaganego połączenia z siecią, wyłącznie po to aby pobrać dane użytkownika. Jeśli pisalibyśmy klienta mobilnego aplikacji, której danymi możemy zarządzać także przez stronę WWW – to rozwiązanie by wygrało (ale i tak musielibyśmy utworzyć mechanizm cache).

Druga opcja wygląda w porządku. Właściwie to używamy jednej tabeli, a nie spodziewam się żebyśmy operowali na ogromnych kolekcjach danych. Prawdopodobnie wydaje się być tutaj najlepszym wyborem – każdemu użytkownikowi wystarczy kilkanaście wpisów. Jednak chciałem się nauczyć czegoś nowego, a tą technikę mam doskonale opanowaną 🙂

Lokalna baza to także plik zapisany na telefonie, jednak biblioteki które go obsługują umożliwiają nam dostęp do podstawowych operacji z System.Linq, co znacznie przyspiesza naszą pracę.

Realm?

Znajomy polecił mi parę miesięcy temu Realm. Pisałem aplikację na iOS i musiałem wgrać super ważne rzeczy na telefon, ale nie wiedziałem jak do tego wykorzystać iTunes. Nie wiem kto powiedział że OS X jest intuicyjnym systemem… napiszę tylko że nie miał racji (to chyba oczywiste, że aby zainstalować aplikację należy ją przeciągnąć do folderu Applications. Po co 2x klik na instalator? Miałby to sam zrobić?).

Wracając do tematu – Realm to silnik NoSQL na licencji open source. Pobawiłem nim się przez chwile, jednak jego .NETowa implementacja pozostawia jeszcze wiele do życzenia. Brak obsługi typu DateTime czy funkcji FirstOrDefault/SingleOrDefault wyraźnie ostudził mój zapał i odinstalowałem go. Może za kilka miesięcy będzie lepiej wyglądał.

Instalacja SQLite

O SQLite słyszałem od dawna, dlatego zdecydowałem się właśnie na to rozwiązanie. Paczka którą pobieramy z NuGeta ma końcówkę PCL. Oznacza to prawdopodobnie, że możemy użyć jej do napisania niezależnej biblioteki (Portable Class Library).

Wykorzystamy tu utworzoną wcześniej reprezentację osoby. Jedyną zmianą będzie usunięcie GUID’a i użycie normalnego klucza głównego.

Jedyne czego w tym momencie potrzebujemy, to klasa odpowiedzialna za łączenie się z bazą i manipulację danymi. Można to rozbić na dwa pliki, jednak moje wrodzone lenistwo skutecznie mi to uniemożliwiło.

CreateTable tworzy tabelę wyłącznie wtedy, gdy ona nie istnieje. Ciekawe jest tu dodawanie/edycja danych. Biblioteka sama potrafi to obsłużyć, nie musimy wskazywać do której tabeli się odnosimy (pewnie później się okaże że robię coś źle…)

Ot i cała filozofia. Mam nadzieję że do końca tego tygodnia zamknę pisanie tej apki i podeślę znajomemu, który też się gubi w długach.