Synchronizuj dane między aplikacją na Androida a serwerem WWW [zamknięte]

262

Chcę zsynchronizować dane (takie jak rekord db, media) między aplikacją na Androida a serwerem. Jeśli widziałeś Evernotelub podobne aplikacje, na pewno rozumiesz, co mam na myśli.

Mam pytanie (wyobraź sobie, że chcemy zsynchronizować rekordy bazy danych):

  1. Każdy użytkownik ma dla siebie część miejsca na serwerze (np. EvernoteLub Dropbox). 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?

  2. Z wyjątkiem JSON , czy istnieje jakiś sposób przesyłania danych między urządzeniem telefonu komórkowego a serwerem?

  3. 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).

Omid Nazifi
źródło
1
Najpierw musisz ustalić (zdecydować) protokół komunikacji z serwerem - stąd - jakie dane możesz przesłać i jak.
hovanessyan
To dla mnie ważne, przenieś dane SQLlite. ale wiedziałbym, jak przenieść inne dane. Nie rozumiem twojego zdania na temat protokołu. proszę wyjaśnić więcej.
Omid Nazifi
Przez protokół Znaczy to simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
wypróbuj konysync, produkt konylabs, który zapewnia kompleksowe rozwiązania na różnych platformach (Android, Windows, iOS), serwery WWW, dostawcy danych (Salesforce, dostawcy SAP), bazy danych (sqlserver, mysql ...)
Saimadan

Odpowiedzi:

311

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.

Grantismo
źródło
3
Co z dużą ilością danych? jak mogę synchronizować?
Pratik Butani,
4
Bardzo dobrze wyjaśnione Mam tylko notatkę ... SyncAdapter -> „wykonaj dużo magii”. Mam nadzieję, że nazywasz to czarną magią ... jest całkowicie zła.
MRodrigues
@MRodrigues: SyncAdapter może być czarną magią dla programisty, ale nadal zapewnia magię stabilności i funkcjonalności, jest znacznie lepszy niż inne biblioteki
Milad Metias,
2
Czego sama usługa wymaga do synchronizacji z urządzeniem z Androidem? Czy to możliwe ze wiosną?
jublikon
58

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. :)

Pratik Butani
źródło
Link do inteligentnego sposobu użytkowania i modernizacji nie działa
Greg Holst
@GregHolst zaktualizowane.
Pratik Butani
3
Cały czas nie działa. Lub wymaga logowania? Archive.org ma to: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul
24

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.

openmobster
źródło
14

@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

Ciro Costa
źródło
Kod źródłowy aplikacji Google IO jest dość przydatny IMO!
Richeek
10

Na przykład chcesz zsynchronizować tabelę todoTablez MySqldoSqlite

Po pierwsze, należy utworzyć jedną nazwę kolumny version (type INT)w todoTablezarówno SqliteiMySql wprowadź opis zdjęcia tutaj

Po drugie, utwórz nazwę tabeli database_versionz nazwą jednej kolumnycurrentVersion(INT)
wprowadź opis zdjęcia tutaj

W MySql, gdy dodajesz nowy element todoTablelub aktualizujesz element, musisz uaktualnić wersję tego elementu o +1, a także uaktualnićcurrentVersion wprowadź opis zdjęcia tutaj

W Androidcelu synchronizacji (ręcznie naciśnij przycisk synchronizacji lub uruchom usługę z okresem):

SqliteWyślesz żądanie z bieżącą wersją (obecnie jest to 1) na serwer.
Następnie na serwerze znajdziesz, który element MySqlma wartość wersji większą niż SqlitecurrentVersion (1), a następnie odpowiedz na Androida (w tym przykładzie element 3 z wersją 2 odpowie na Androida)

W SQLitedodasz lub zaktualizujesz nowy element todoTablei zaktualizujesz bieżącą wersję

Phan Van Linh
źródło
1
Twój pomysł jest genialny, ale nadal nie rozumiem poprawnie projektu stołu. Działa wraz z usługami odpoczynku i odpowiednią usługą synchronizacji
Ahesanali Suthar
6

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

Kyle
źródło
Jakie są darmowe plany oferowane w ofercie?
Prakhar Mohan Srivastava
12
http://parse.com/ jest zamknięty.
Chintan Rathod
4
nadal możesz korzystać z funkcji parse.com, ale na własnym serwerze
otworzyły się
3

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 HttpRequestobiektów w Javie lub możesz napisać własne TCP/IPnarzędzie do przesyłania danych. Dane można wysyłać w JSONformacie 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ć, HttpRequestsaż przyjdzie i przeanalizuje dane i zapisze je w dowolnym miejscu.

Mayank
źródło
Jak sprawdzić dane zaktualizowane w lokalnej aplikacji i serwerze? i jak połączyć razem? Nie jest dobrze, że przesyłam cały zapis przez JSON lub cokolwiek innego do wniosku o ich scalenie. co myślisz?
Omid Nazifi
2
możesz użyć flagi, takiej jak „na serwerze” z int / bool 1/0 dla tak lub nie. kiedy zostanie wysłany rekord / plik / blok danych, sprawdź sukces na serwerze i ustaw bit na „tak”. następnie jeśli używasz czegoś takiego jak SQLite, możesz zrobić polecenie „WYBIERZ * Z mojej tabeli, GDZIE wysłane = 0”, aby wysłać nowe rekordy
Evan R.
1

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.

Neo
źródło
1

@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

Sean
źródło