Aktualnie tworzę aplikację na Androida, która współpracuje z usługą RESTful. Klient może wykonać pełny CRUD w serwisie internetowym. Po wyszukaniu sprawdzonych metod obejrzałem na blogu Google I/O 2010 r. Temat klientów REST, który jest cytowany w prawie wszystkich artykułach.Jak zaimplementować prostą architekturę REST i ContentProvider za pomocą modeli?
Aby użyć tyle platformie Android, jak to możliwe, postanowiłem pójść z opcji B użyciu ContentProvider
i SyncAdapter
. To zapewniło mi wbudowany system kont, obserwatorów treści i okresowych synchronizacji, gdy dostęp do internetu jest możliwy.
Ponieważ jedną bardzo ważną cechą naszej aplikacji jest edycja i dostępność w trybie offline (jest używana w środowiskach o złym odbiorze), chcemy przechowywać jak najwięcej istotnych danych lokalnie, jak to możliwe.
klient komunikuje się z serwerem przy użyciu relaksującego API w Json, dane z serwera jest rozszeregować wykorzystaniem Gson na Models, (Plain Old obiekty Java Pojo'S).
Aby kod był czytelny i łatwy do odczytania, próbowałem utworzyć własny obiekt odwzorowujący obiekt zamiast używać bezpośrednio numeru Cursor
. Ten odwzorowujący zapewnia domyślnych CRUD-operacje i mapy kursory do modelek podczas odczytywania danych i Modele do ContentValues podczas zapisywania danych.
Jednak architektura ta jest bardzo rozdęta.
Przede wszystkim to nie jest możliwe, aby uzyskać wiarygodne informacje o aktualnej
SyncState
(dostarczenie informacji zwrotnej do użytkownika). (Now „hacked” za pomocą this SO answer)Drugim problemem jest to, że dla każdego zasobu będę potrzebował: modelką, element odwzorowujący definicję tabeli i ContentProvider URI. Które jest dużo kodu do zarządzania dla jednego zasobu.
Trzeci problem polega na tym, że wymagając modeli za pośrednictwem mojego mapera, zablokowałem sobie korzystanie z
CursorLoader
w Działaniach.
Konkluzja
ja szukam utrzymaniu i lekkiej tytułem mający zawartość offline i synchronizację z relaksującego usługa wykorzystaniem JSON. Również chciałbym móc używać modeli w moim kodzie, ponieważ user.getName()
jest o wiele bardziej przyjazny dla programisty niż cursor.getString(cursor.getColumnIndex(UserDataSource.COLUMN_NAME));
(który jest obecnie ukryty w mojej klasie Mapper).
Dobrym przykładem na mapowaniu będzie Dapper połączeniu z Dapper Extensions pisemnej NET ale podobny do mojego podejścia, jednak moje podejście wymagane wszystkie kolumny i pola, które zostaną określone w wielu różnych plików (patrz wyżej).
Również, rozważam zrzucić kod ContentProvider
z mojego kodu, ponieważ jest bardzo rozdęty i przestarzały w przypadku tak prostego zadania.
IMHO, ContentProvider + Kursory są lepsze dla ListView niż POJO ... z POJO będziesz mieć wiele problemów z odświeżaniem danych (jak POJO lub POJO's Array/ListArray będą wiedzieć, czy dane zmienią się na serwerze i zsynchronizujesz je). o problemach: 1. nie ma znaczenia każde użycie aktualizacji/wstawienia/usunięcia CP spróbuje zsynchronizować się z serwerem ... 2. więc nie pisz sam ... wykonałem generator kodu (fx .: from XML lub Adnotacje kompilacji) lub użyj Adnotacji dla środowiska wykonawczego generującego CP ... 3. prawda ... to dlaczego w ogóle go nie używam ... – Selvin
Czy istnieją dobre dobre rozwiązania dla # 2, a może nawet bardziej kompletne, dla np. biblioteka owijająca, która wymaga tylko jednej defenacji na zasób? Zgadzam się na # 1 i # 3, ale używamy niestandardowych sposobów wyświetlania danych (płótna). Sądzę, że byłaby to możliwa do rozwiązania poprzez implementację jakiegoś adaptera kursora. Chociaż nie jestem pewien, czy jest to możliwe na płótnie. – christiaanderidder