Synchronizuj dane między aplikacją Android i serwerem WWW [zamknięte]

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 synchronizować rekordy DB):

  1. Każdy użytkownik ma część miejsca na serwerze dla siebie (np. Evernote lub Dropbox). Może użytkownik tworzy nowe rekordy przez telefon komórkowy i tworzy nowe rekordy na serwerze. Jak mogę dopasować te rekordy razem? Jeśli są rekordy o tym samym ID jakie algorytmy mi proponujesz?

  2. Z wyjątkiem JSON, Czy Jest jakiś sposób na przesyłanie danych między urządzeniem komórkowym a serwerem?

  3. Jeśli SyncAdapter i ContentProvider mogą rozwiązać moje problemy, wyjaśnij mi dokładnie. (Gdybyś mógł zaoferować mi próbki lub samouczki lub porady lub słowa kluczowe, które pomogą poszerzyć / poprowadzić moje wyszukiwanie, również byliby mile widziani).

Author: jaysoifer, 2012-05-31

9 answers

Postaram się odpowiedzieć na wszystkie Twoje 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 komponentów na urządzeniu z Androidem.

Trwałe Przechowywanie:

W ten sposób Twój telefon faktycznie przechowuje dane, które otrzymuje z serwera www. Jedną z możliwych metod osiągnięcia tego jest napisanie własnego ContentProvider wspierany 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/

A ContentProvider definiuje spójny interfejs do interakcji z przechowywanymi danymi. Może również umożliwić innym aplikacjom interakcję z Twoimi danymi, jeśli chcesz. Za ContentProvider może być baza danych Sqlite, Pamięć podręczna lub dowolny dowolny magazyn mechanizm.

Chociaż z pewnością zalecałbym użycie ContentProvider z bazą danych Sqlite, możesz użyć dowolnego mechanizmu przechowywania opartego na Javie, jakiego chcesz.

Format Wymiany Danych:

Jest to format, którego używasz do wysyłania danych między serwerem internetowym a aplikacją na Androida. Dwa najpopularniejsze formaty w dzisiejszych czasach to XML i JSON. Wybierając format, należy zastanowić się, jakiego rodzaju biblioteki serializacyjne są dostępne. Wiem, że jest fantastyczna biblioteka do serializacji json o nazwie gson: https://github.com/google/gson , chociaż jestem pewien, że podobne biblioteki istnieją dla XML.

Usługa Synchronizacji

Będziesz potrzebował jakiegoś zadania asynchronicznego, które może uzyskać nowe dane z serwera i odświeżyć zawartość mobilną, aby odzwierciedlić zawartość serwera. Będziesz również chciał powiadomić serwer za każdym razem, gdy wprowadzasz lokalne zmiany w zawartości i chcesz je odzwierciedlić. Android zapewnia syncadapter wzór jako sposób na łatwe rozwiązanie tego wzoru. Musisz zarejestrować konta użytkowników, a następnie Android wykona dla Ciebie wiele magii i pozwoli Ci na Automatyczną synchronizację. Oto dobry tutorial: 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 z unikalnym identyfikatorem, który przechowujesz zarówno na urządzeniu z Androidem, jak i na serwerze. Możesz tego użyć aby upewnić się, że odnosisz się do tego samego odniesienia. Ponadto możesz przechowywać atrybuty kolumn, takie jak" updated_at", aby upewnić się, że zawsze otrzymujesz najświeższe dane lub nie zapisujesz przypadkowo nowo zapisanych danych.

 294
Author: Grantismo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-10 14:28:07

Jeśli pomyślimy o dzisiaj, akceptowana odpowiedź jest za stara. Jak wiemy, 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 adapter synchronizacji w aplikacji zawiera kod Dla zadań przesyłania danych między urządzeniem a serwerem. Na podstawie harmonogramu i wyzwalaczy podanych w aplikacji, Synchronizacja ramka adaptera uruchamia kod w komponencie adapter synchronizacji.

  • RealM : Realm jest mobilną bazą danych: zamiennikiem dla SQLite i podstawowych danych.

  • Retrofit type-bezpieczny klient HTTP dla Androida i Javy firmy Square, Inc. Must Learn a-smart-way-to-use-retrofit

A twoja logika synchronizacji dla bazy danych typu: Jak zsynchronizować bazę danych SQLite na telefonie z Androidem z bazą danych MySQL na serwerze?

Powodzenia wszystkim nowym ucznia. :)

 47
Author: Pratik Butani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:36

Jeśli sam to napiszesz to są niektóre z punktów, o których warto pamiętać

Prawidłowe uwierzytelnianie pomiędzy urządzeniem a serwerem synchronizacji

Protokół synchronizacji między urządzeniem a serwerem. Zazwyczaj przechodzi w 3 fazach, uwierzytelnianie, wymiana danych, wymiana statusu (które operacje działały, a które nie)

Wybierz format ładunku. Sugeruję XML oparty na SyncML zmieszany z formatem opartym na JSON, aby reprezentować rzeczywiste dane. Więc SyncML dla protokołu, a JSON dla faktyczna wymiana danych. Używanie tablicy JSON podczas manipulowania danymi jest zawsze preferowane, ponieważ łatwo jest uzyskać dostęp do danych za pomocą tablicy JSON.

Śledzenie zmian danych zarówno na kliencie, jak i na serwerze. Możesz prowadzić changelog zmieniających się identyfikatorów i odbierać je podczas sesji synchronizacji. Wyczyść również changelog, ponieważ obiekty są pomyślnie zsynchronizowane. Możesz również użyć zmiennej logicznej, aby potwierdzić status synchronizacji, tj. ostatni czas synchronizacji. To będzie pomocne dla końca użytkowników, aby określić czas, kiedy ostatnia synchronizacja jest wykonywana.

Trzeba mieć sposób komunikowania się z serwera do urządzenia, aby rozpocząć sesję synchronizacji w miarę zmian danych na serwerze. Możesz użyć C2DM lub napisać własną trwałą komunikację opartą na tcp. Podejście tcp jest dużo bezproblemowe

Sposób replikowania zmian danych na wielu urządzeniach

I ostatni, ale nie najmniej ważny, sposób wykrywania i radzenia sobie z konfliktami

Mam nadzieję, że to pomoże jako dobry punkt wyjścia.

 22
Author: openmobster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 11:46:55

@ Grantismo zapewnia świetne Wyjaśnienie na temat ogólnego. Jeśli chcesz wiedzieć, kto naprawdę robi to, proponuję rzucić okiem na to, jak google zrobił dla aplikacji Google IO z 2014 roku (zawsze warto spojrzeć głęboko na kod źródłowy tych aplikacji, które wydają. Jest z tego wiele do nauczenia).

Oto wpis na blogu o tym: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

Zasadniczo, na strona aplikacji: GCM do sygnalizacji, adapter synchronizacji do pobierania danych i prawidłowej rozmowy z dostawcą treści, który sprawi, że rzeczy będą trwałe (tak, izoluje DB od bezpośredniego dostępu z innych części aplikacji).

Również, jeśli chcesz spojrzeć na kod 2015: https://github.com/google/iosched

 13
Author: Ciro Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 02:51:40

Spójrz na parseplatform.org . to projekt opensource.

(jak również można 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 zapewnia świetne API po stronie klienta Androida

 5
Author: Kyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 08:49:35

Na przykład, chcesz zsynchronizować tabelę todoTable z MySql do Sqlite

Najpierw Utwórz jedną nazwę kolumny version (type INT) w {[0] } zarówno dla Sqlite, jak i MySql Tutaj wpisz opis obrazka

Po Drugie, Utwórz nazwę tabeli database_version z nazwą jednej kolumnycurrentVersion(INT)
Tutaj wpisz opis obrazka

W MySql, kiedy dodajesz nowy element do todoTable lub aktualizujesz element, musisz uaktualnić wersję tego elementu o +1 i również Uaktualnij currentVersion Tutaj wpisz opis obrazka

W Android, gdy chcesz synchronizować (przez w zależności od tego, czy jest to usługa, czy usługa jest uruchomiona z czasem):

Zostanie wysłane zapytanie z Sqlite currentVersion (obecnie jest to 1) do serwera.
Następnie w serwerze znajdziesz, który element w MySql ma wartość wersji większą niż Sqlite currentVersion(1), a następnie odpowiedź na Androida (w tym przykładzie pozycja 3 z wersją 2 odpowie na Androida)

W SQLite, dodasz lub zaktualizujesz nowy element do todoTable i zaktualizujesz currentVersion

 5
Author: Phan Van Linh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 01:18:42

Jednym ze sposobów na osiągnięcie tego celu jest posiadanie aplikacji po stronie serwera, która czeka na dane. Dane mogą być wysyłane za pomocą obiektów HttpRequest w Javie lub można napisać własne narzędzie do przesyłania danych TCP/IP. Dane mogą być wysyłane przy użyciu formatu JSON lub dowolnego innego formatu, który uważasz za odpowiedni. Również dane mogą być szyfrowane przed wysłaniem do serwera, jeśli zawierają poufne informacje. Aplikacja serwera musi tylko poczekać, aż HttpRequests wejdzie i przetworzy Dane i zapisze je w dowolnym miejscu.

 3
Author: Mayank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 08:49:56

Sugerowałbym użycie binarnego protokołu webservice podobnego do Hessian. Działa bardzo dobrze i mają implementację Androida. Może to być trochę ciężkie, ale zależy od aplikacji, którą budujesz. Mam nadzieję, że to pomoże.

 1
Author: Neo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-07 00:40:43

@Grantismo daje świetny przegląd komponentów synchronizacji Androida.

Biblioteka SyncManagerAndroid zapewnia prostą, dwukierunkową implementację synchronizacji do podłączenia do systemu Android Sync framework (AbstractThreadedSyncAdapter.OnPerformSync).

Https://github.com/sschendel/SyncManagerAndroid

 1
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-26 15:25:41