JDBC i zdalne bazy w Androidzie

Dziś zajmiemy się oprogramowywaniem połączenia programu na Androida z bazami danych umiejscowionymi na zdalnych serwerach. W tym przykładzie użyłem bazy danych PostgreSQL w wersji 9.4. Nasza apka pracuje tutaj jako Client tej bazy. Przykład jest banalnie prosty, ponieważ aplikacja pobiera jedną wartość z jednej tabeli i wyświetla tę wartość na konsoli. Ma to jedynie zademonstrować rozwiązanie i sposób działania.


Zakładam, że czytelnik niniejszej publikacji potrafi posługiwać się JDBC w zwykłych aplikacjach w Javie, oraz ma pewne doświadczenie w tworzeniu choćby prostych aplikacji dla Androida.


W pierwszej kolejności uruchamiam PGAdmin3 i tworzę w bazie danych tabelkę oraz dodaję do niej trzy wpisy: 




We właściwościach projektu dodaję ściągniętego liba do postgresa:




Zaznaczam go też tutaj:




Dalej dodaję klasę connectora do bazy. Connector nie różni się w zasadzie niczym od takiego jakiego użylibyśmy w normalnej javowej aplikacji.




Dodajemy klasyczne DAO. Dokładnie takie jak w zwykłej aplikacji javowej. Jak dotąd w zasadzie nie ma żadnych różnic....




… aż do teraz. Przechodzimy do serwisu. 




W oczy rzuca się tutaj klasa rozszerzająca AsyncTask. O co tutaj chodzi? W przeciwieństwie do zwykłych aplikacji napisanych w Javie, tak połączenia z bazą zewnętrzną (i jakiekolwiek inne sieciowe) w aplikacjach dla Androida muszą być objęte osobnym wątkiem. Próba bezpośredniego wywołania metody z DAO odwołującej się do bazy i korzystającej z connectora zakończyłaby się komunikatem o błędzie (poszukajcie fragmentu: StrictMode$androidBlockGuardPolicy).  Klasa abstrakcyjna AsyncTask pozwala na uruchomienie odwołania do bazy w osobnym wątku.  Zasadnicze działanie któe ma zostać wykonane opisujemy w metodzie „doInBackground”. Klasa AsyncTask została opisana w artykule poświęconym wielowątkowości. Parametry <String,Void,Double>:


Pierwszy – określa typ danych parametru wejściowego dla metody doInBackground. Drugi określa typ parametru wejściowego w nieużywanej tutaj metodzie onProgressUpdate. Trzeby określa typ danych zwracanych przez metodę doInBackground.


We wszystkich przypadkach mogłyby to być klasy zdefiniowane przez nas lub tablice obiektów. Wywołanie metody z dao musimy opakować w metodę doInBackground klasy rozszerzającej AsyncTask. Dodatkowa metoda getKurs(String symbol) służy tutaj jedynie uproszczeniu wywołania, nie jest niezbędna. 


Samo wywołanie to po prostu wywołanie metody z obiektu klasy serwisu:




Musimy jeszcze pamiętać o dodaniu odpowiednich uprawnień – łączymy się przecież poprzez sieć. Dodajemy więc do naszego pliku manifestu taki wpis  :




Po uruchomieniu powinniśmy na LogCacie zobaczyć tego typu wpis: