Chcę zsynchronizować dane (takie jak rekord db, media) między aplikacją na Androida a serwerem. Jeśli widziałeś Evernote
lub podobne aplikacje, na pewno rozumiesz, co mam na myśli.
Mam pytanie (wyobraź sobie, że chcemy zsynchronizować rekordy bazy danych):
Każdy użytkownik ma dla siebie część miejsca na serwerze (np.
Evernote
LubDropbox
). Być może użytkownik tworzy nowe rekordy za pomocą telefonu komórkowego i tworzy nowe rekordy na serwerze. Jak mogę połączyć te rekordy razem? Jeśli istnieją rekordy o tym samym identyfikatorze Jakie algorytmy sugerujesz mi?Z wyjątkiem JSON , czy istnieje jakiś sposób przesyłania danych między urządzeniem telefonu komórkowego a serwerem?
Jeśli SyncAdapter i ContentProvider mogą rozwiązać moje problemy, wyjaśnij mi dokładnie. (Jeśli możesz zaoferować mi próbki lub samouczki LUB Wszelkie porady lub słowa kluczowe, które pomogą poszerzyć / poprowadzić moje wyszukiwanie, również będą mile widziane).
źródło
Odpowiedzi:
Spróbuję odpowiedzieć na wszystkie pytania, odpowiadając na większe pytanie: Jak mogę zsynchronizować dane między serwerem internetowym a aplikacją na Androida?
Synchronizacja danych między serwerem internetowym a aplikacją na Androida wymaga kilku różnych składników na urządzeniu z Androidem.
Pamięć trwała:
W ten sposób telefon faktycznie przechowuje dane otrzymane z serwera. Jedną z możliwych metod osiągnięcia tego jest napisanie własnego niestandardowego ContentProvider wspieranego przez bazę danych Sqlite. Przyzwoity samouczek dla dostawcy treści można znaleźć tutaj: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/
ContentProvider definiuje spójny interfejs do interakcji z przechowywanych danych. Może także pozwolić innym aplikacjom na interakcję z twoimi danymi, jeśli chcesz. Za twoim ContentProvider może znajdować się baza danych Sqlite, pamięć podręczna lub dowolny dowolny mechanizm przechowywania.
Chociaż z pewnością poleciłbym użycie ContentProvider z bazą danych Sqlite, możesz użyć dowolnego mechanizmu pamięci opartego na Javie.
Format wymiany danych:
Jest to format używany do przesyłania danych między serwerem internetowym a aplikacją na Androida. Obecnie dwa najpopularniejsze formaty to XML i JSON. Wybierając format, powinieneś pomyśleć o tym, jakie biblioteki bibliotek serializacji są dostępne. Wiem od razu , że istnieje fantastyczna biblioteka serializacji json o nazwie gson: https://github.com/google/gson , chociaż jestem pewien, że istnieją podobne biblioteki dla XML.
Usługa synchronizacji
Będziesz potrzebować jakiegoś asynchronicznego zadania, które może pobrać nowe dane z serwera i odświeżyć zawartość mobilną, aby odzwierciedlić zawartość serwera. Będziesz także chciał powiadamiać serwer za każdym razem, gdy wprowadzasz lokalne zmiany w treści i chcesz odzwierciedlić te zmiany. Android zapewnia wzorzec SyncAdapter jako sposób na łatwe rozwiązanie tego wzorca. Musisz zarejestrować konta użytkowników, a wtedy Android wykona dla ciebie wiele magii i pozwoli ci na automatyczną synchronizację. Oto dobry samouczek: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
Jeśli chodzi o sposób identyfikacji, czy rekordy są takie same, zazwyczaj tworzysz przedmioty o unikalnym identyfikatorze, które przechowujesz zarówno na urządzeniu z Androidem, jak i na serwerze. Możesz użyć tego, aby upewnić się, że odwołujesz się do tego samego odwołania. Co więcej, możesz przechowywać atrybuty kolumn, takie jak „updated_at”, aby mieć pewność, że zawsze otrzymujesz najświeższe dane lub nie przypadkowo zapisujesz nowo zapisane dane.
źródło
Jeśli pomyślimy o dniu dzisiejszym , zaakceptowana odpowiedź jest za stara. Ponieważ wiemy, że mamy wiele nowych bibliotek, które mogą pomóc w tworzeniu tego typu aplikacji.
Powinieneś nauczyć się następujących tematów, które na pewno Ci pomogą:
SyncAdapter: Komponent adaptera synchronizacji w aplikacji zawiera kod dla zadań, które przesyłają dane między urządzeniem a serwerem. W oparciu o harmonogram i wyzwalacze podane w aplikacji środowisko adaptera synchronizacji uruchamia kod w komponencie adaptera synchronizacji.
Realm : Realm to mobilna baza danych: zamiennik SQLite i Core Data.
Modernizacja Bezpieczny klient HTTP dla systemu Android i Java firmy Square, Inc. Musi nauczyć się inteligentnej metody użycia
A twoja logika synchronizacji dla bazy danych, jak: Jak zsynchronizować bazę danych SQLite na telefonie z Androidem z bazą danych MySQL na serwerze?
Powodzenia dla wszystkich nowych uczniów. :)
źródło
Jeśli napiszesz to sam, oto kilka punktów, o których należy pamiętać
Prawidłowe uwierzytelnianie między urządzeniem a serwerem synchronizacji
Protokół synchronizacji między urządzeniem a serwerem. Zwykle przebiega w 3 fazach: uwierzytelnianie, wymiana danych, wymiana statusu (które operacje działały, a które nie)
Wybierz format ładunku. Proponuję XML oparty na SyncML zmieszany z formatem opartym na JSON, aby reprezentować rzeczywiste dane. Więc SyncML dla protokołu i JSON dla rzeczywistych wymienianych danych. Korzystanie z tablicy JSON podczas manipulowania danymi jest zawsze preferowane, ponieważ dostęp do danych za pomocą tablicy JSON jest łatwy.
Śledzenie zmian danych na kliencie i serwerze. Możesz utrzymywać dziennik zmian identyfikatorów, które się zmieniają, i wybierać je podczas sesji synchronizacji. Wyczyść także dziennik zmian, ponieważ obiekty są pomyślnie synchronizowane. Możesz także użyć zmiennej boolean do potwierdzenia statusu synchronizacji, tj. Ostatniej synchronizacji. Pomocne będzie dla użytkowników końcowych określenie godziny ostatniej synchronizacji.
Musisz mieć sposób komunikowania się między serwerem a urządzeniem, aby rozpocząć sesję synchronizacji w miarę zmiany danych na serwerze. Możesz użyć C2DM lub napisać własną stałą komunikację opartą na tcp. Podejście tcp jest bardzo płynne
Sposób replikacji zmian danych na wielu urządzeniach
I wreszcie sposób wykrywania i rozwiązywania konfliktów
Mam nadzieję, że to pomoże jako dobry punkt wyjścia.
źródło
@Grantismo zapewnia doskonałe wyjaśnienie całości. Jeśli chcesz wiedzieć, kto tak naprawdę to robi, sugeruję przyjrzeć się, jak Google zrobił dla aplikacji Google IO 2014 (zawsze warto dokładnie przyjrzeć się kodowi źródłowemu tych aplikacji, które wypuszczają). stamtąd wiele się nauczyć).
Oto post na blogu na ten temat: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html
Zasadniczo po stronie aplikacji: GCM do sygnalizacji, Sync Adapter do pobierania danych i poprawnego komunikowania się z Content Provider, który sprawi, że rzeczy będą trwałe (tak, izoluje DB od bezpośredniego dostępu z innych części aplikacji).
Ponadto, jeśli chcesz zapoznać się z kodem z 2015 roku: https://github.com/google/iosched
źródło
Na przykład chcesz zsynchronizować tabelę
todoTable
zMySql
doSqlite
Po pierwsze, należy utworzyć jedną nazwę kolumny
version (type INT)
wtodoTable
zarównoSqlite
iMySql
Po drugie, utwórz nazwę tabeli
database_version
z nazwą jednej kolumnycurrentVersion(INT)
W
MySql
, gdy dodajesz nowy elementtodoTable
lub aktualizujesz element, musisz uaktualnić wersję tego elementu o +1, a także uaktualnićcurrentVersion
W
Android
celu synchronizacji (ręcznie naciśnij przycisk synchronizacji lub uruchom usługę z okresem):Sqlite
Wyślesz żądanie z bieżącą wersją (obecnie jest to 1) na serwer.Następnie na serwerze znajdziesz, który element
MySql
ma wartość wersji większą niżSqlite
currentVersion (1), a następnie odpowiedz na Androida (w tym przykładzie element 3 z wersją 2 odpowie na Androida)W
SQLite
dodasz lub zaktualizujesz nowy elementtodoTable
i zaktualizujesz bieżącą wersjęźródło
Spójrz na parseplatform.org . to projekt typu open source.
(Jak tylko możesz przejść do pakietu komercyjnego dostępnego na back4app.com .)
Jest to bardzo prosta i przyjazna dla użytkownika usługa bazy danych po stronie serwera, która daje świetne API po stronie klienta na Androida
źródło
jednym ze sposobów osiągnięcia tego jest posiadanie aplikacji po stronie serwera, która czeka na dane. Dane mogą być wysyłane przy użyciu
HttpRequest
obiektów w Javie lub możesz napisać własneTCP/IP
narzędzie do przesyłania danych. Dane można wysyłać wJSON
formacie lub innym formacie, który uważasz za odpowiedni. Również dane mogą być szyfrowane przed wysłaniem na serwer, jeśli zawierają poufne informacje. Wszystko, co aplikacja serwera musi zrobić, to po prostu czekać,HttpRequests
aż przyjdzie i przeanalizuje dane i zapisze je w dowolnym miejscu.źródło
Sugerowałbym użycie binarnego protokołu usługi sieciowej podobnego do Heskiego . Działa bardzo dobrze i mają implementację Androida. Może być trochę ciężki, ale zależy od budowanej aplikacji. Mam nadzieję że to pomoże.
źródło
@Grantismo daje doskonały przegląd komponentów synchronizacji Androida.
Biblioteka SyncManagerAndroid zapewnia prostą dwukierunkową implementację synchronizacji w celu podłączenia do platformy Android Sync (AbstractThreadedSyncAdapter.OnPerformSync).
https://github.com/sschendel/SyncManagerAndroid
źródło