2013-03-21 20 views
10

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.

+0

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

+0

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

Odpowiedz

1

Czy rozważałeś użycie ORM? W przeszłości odniosłem sukces w połączeniu z OrmLite i Jackson. Będziesz musiał napisać własną usługę synchronizacji, ale OrmLite dba o podnoszenie ciężarów, jeśli chodzi o modele danych.

Chociaż niektóre elementy nici, które zapewnia kombinacja ContentProvider + SyncAdapter (nadal nie ma kursora CursorLoader, gdy używane są POJO), konfiguracja ta może zmniejszyć obciążenie złożonego schematu i/lub wielu typów.

Oto przykład z definicji tabeli z głównej OrmLite za:

@DatabaseTable(tableName = "accounts") 
public class Account { 
    @DatabaseField(id = true) 
    private String name; 

    @DatabaseField(canBeNull = false) 
    private String password; 
} 

Jak widać, model + mapowanie + definicja tabeli przychodzi razem bardzo szybko i bezboleśnie.

+0

Rozważałem użycie ORM, ale wciąż zastanawiam się nad najlepszą praktyką na Androidzie, ponieważ ContentProvider + SyncAdapter zapewnia pewne dodatki, ale z drugiej strony wymaga dużo nadmiaru. Przyjmę twoją odpowiedź, ponieważ prawdopodobnie spróbuję ORM metoda ze względu na czytelność i łatwość konserwacji. – christiaanderidder

Powiązane problemy