Najlepszy sposób na synchronizację lokalnej bazy danych HTML5 (WebSQL Storage, SQLite) z serwerem (synchronizacja dwukierunkowa) [zamknięte]

151

Tworzę mobilną aplikację internetową (na iPhone'a i Androida) z lokalną bazą danych (przy użyciu magazynu html5), aby moja aplikacja była nadal dostępna, gdy użytkownik jest offline.

To działa doskonale, ale chcę zapisać lokalne dane na serwerze. Muszę więc zsynchronizować lokalną bazę danych z bazą danych na serwerze. Synchronizacja może być tylko jednokierunkowa, ale w przyszłości chciałbym synchronizować ją w obie strony (serwer <-> lokalna baza danych).

To wymaganie wygląda bardzo często (lub będzie w przyszłości powszechne w przypadku aplikacji internetowych na urządzenia mobilne), ale nie mogę znaleźć biblioteki, która to robi.

Wiem, że Google robi to w swojej aplikacji mobilnej (np. Gmail) i znalazłem projekt WSPL jako projekt Google, ale bez źródła do pobrania.

Jeśli nie mogę znaleźć rozwiązania, utworzę bibliotekę, aby to zrobić, ponieważ synchronizacja w jedną stronę nie wygląda na trudną, ale zastanawiam się, czy są inne rozwiązania.

Samuel
źródło
2
Nie wiem, czy istnieją jakieś biblioteki, ale najłatwiejszym sposobem na to wydaje się być przechowywanie znacznika czasu modyfikacji i przenoszenie zmian do rekordów, które są nowsze niż rekordy po drugiej stronie, a także przenoszenie dodatków i usunięć od ostatniej synchronizacji. Może zwariować, jeśli zegary lokalne i serwera nie są zsynchronizowane, ale coś wymyślisz. - Publikowanie jako komentarz, ponieważ prawdopodobnie nie jest zbyt pomocne i nie zapewnia odpowiedzi.
Ivan Vučica
Dzięki Ivan. Masz rację, jeśli zegary lokalnego i serwera nie są zsynchronizowane, może być bałagan ... Właśnie odkryłem, że: quickconnect.pbworks.com/Using-Enterprise-Synchronization Mówi, że może zsynchronizować lokalną bazę danych HTML 5 z DB na serwerze. Muszę przyjrzeć się temu dokładniej i sprawdzić, czy może działać poza platformą QuickConnect Framework ...
Samuel
Znalazłem inne rozwiązanie: impel.simulacre.org/blog/… Wygląda świetnie, ale będziesz musiał użyć biblioteki Mootools i Impel ORM ...
Samuel
1
A co z CouchDB? couchdb.apache.org
julianm,
4
Tematy służą do dyskusji , a Stack Exchange do pytań . W pewnym momencie takie posty były akceptowane na Stack Exchange, ale już nie.
casperOne

Odpowiedzi:

70
  • Stworzyłem małą bibliotekę JS o nazwie WebSqlSync, aby zsynchronizować lokalną bazę danych WebSql z serwerem (klient <-> serwer). Bardzo łatwy w użyciu i integracji z Twoim kodem:

https://github.com/orbitaloop/WebSqlSync

  • Projekt open source QuickConnect zawiera bibliotekę JS do synchronizacji lokalnej bazy danych SQLite HTML5 z bazą danych serwera (MySQL lub inną):

http://quickconnect.pbworks.com/Using-Enterprise-Synchronization

Aby użyć tej biblioteki, musisz użyć DataAccessObject frameworku, aby uzyskać dostęp do swojej bazy danych. Działa poprzez przechowywanie wszystkich żądań SQL zastosowanych do bazy danych (z wyjątkiem oczywiście wyboru) i wysyłanie ich na serwer. Zarządzanie usuwaniem jest świetne, ale jest to trochę ciężkie, jeśli masz dużo aktualizacji, a serwer musi używać tego samego języka SQL ...

  • Kolejny projekt z QuickConnect to natywna synchronizacja SQLite (w Objective C na iOS lub Mac OS oraz w Javie na Androida):

http://www.quickconnectfamily.org/qcdbsync/ (myślę, że przechowuje również historię wszystkich żądań SQL)

  • I właśnie znalazłem kolejną obiecującą bibliotekę JS: persistenceJS

https://github.com/zefhemel/persistencejs

„persistence.js to asynchroniczna biblioteka obiektowo-relacyjna w języku JavaScript. Można jej używać w przeglądarce, a także na serwerze (i można między nimi udostępniać modele danych)”.

Mają moduł synchronizacji bazy danych: DOC of persistence.synch.js

(współpracuje z HTML5 DB SQLite lub Google Gears na kliencie i MySQL na serwerze)

  • Jest też Impel.inTouch . Wygląda na bardzo łatwego w użyciu (z dołączonymi plikami php), ale musisz użyć frameworka Mootools po stronie klienta:

http://impel.simulacre.org/api/Impel.inTouch

  • Sencha ma również usługę synchronizacji: Sencha.io . Wygląda świetnie, ale zależy od frameworka Sencha Touch:

http://www.sencha.com/products/io/

Samuela
źródło
Cześć Samuel, czy js lib wyszło ci na dobre?
Mathias Conradt
Synchronizacja DB nie jest na razie moim priorytetem, więc po prostu się poddaję, czekając na bardziej standardowe i solidne rozwiązanie ...
Samuel
3
Po przetestowaniu ich wszystkich, myślę, że opracuję własną małą bibliotekę JS do synchronizacji WebSQL z bazą danych serwera. Będzie to podwójna synchronizacja (lokalny serwer <->) i nie będzie mieć żadnych zależności. Zamieszczę tutaj link do kodu po zakończeniu
Samuel
2
Zatwierdziłem pierwszą wersję mojego własnego rozwiązania do synchronizacji o nazwie WebSqlSync: github.com/orbitaloop/WebSqlSync (patrz poniżej odpowiedź)
Samuel
1
Cześć chłopaki, uruchomiłem wtyczkę persistencejs do spokojnej synchronizacji. Wciąż jest w fazie rozwoju, ale jeśli ktoś chce to sprawdzić: github.com/robertokl/persistencejs i działający przykład po stronie serwera / klienta z rubinem na szynach: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

Opracowałem ogólne rozwiązanie do synchronizacji o nazwie WebSqlSync .

Nie zależy od żadnego frameworka. Jest dostępny tutaj: https://github.com/orbitaloop/WebSqlSync

Wyciąg z pliku README:

WebSqlSync

Automatycznie synchronizuj lokalną bazę danych WebSql (SQLite w nawigatorze) z serwerem. (Synchronizacja dwukierunkowa: klient <-> serwer)

Bardzo łatwa integracja z istniejącą aplikacją i bardzo łatwa w użyciu (2 funkcje do wywołania: initSync i syncNow)

Stosowanie

Zainicjuj

Musisz zainicjować bibliotekę (na przykład przy każdym uruchomieniu).

Automatycznie utworzy 2 tabele (jeśli jeszcze nie istnieją, jedną do przechowywania wszystkich nowych lub zmodyfikowanych elementów (tabela new_elem) i jedną do przechowywania daty ostatniej synchronizacji (tabela sync_info). Utworzy również wyzwalacze SQLite w aby obserwować INSERT lub UPDATE na tabelach, które chcesz zsynchronizować (aby automatycznie wstawić zmodyfikowane elementy w tabeli new_elem):

DBSYNC.initSync(TABLES_TO_SYNC, webSqlDb, sync_info, 'http://www.myserver.com', callBackEndInit);

Gdzie TABLES_TO_SYNC to lista tabel, które chcesz zsynchronizować z serwerem, np .:

TABLES_TO_SYNC = [
    {tableName : 'table1', idName : 'the_id'},
    {tableName : 'table2'} //if idName not specified, it will assume that it's "id"
];

Synchronizować

Aby rozpocząć synchronizację, musisz wywołać funkcję syncNow. Możesz to wywołać co X sekund lub po kilku zmianach, na przykład:

DBSYNC.syncNow(callBackSyncProgress, function(result) {
     if (result.syncOK === true) {
         //Synchronized successfully
     }
});

I to wszystko, co musisz zrobić na kliencie. Po stronie serwera będziesz musiał zakodować własne rozwiązanie (ale nie jest to skomplikowane). Jest też przykład w PHP i Javie. Ponownie mile widziane są składki.

Samuel
źródło
Jak dobrze powiedziałbyś, że to zadziałało, podsumowując to rok później? Szukam dobrej bazy danych po stronie klienta, która działa dla przeglądarek i jednostek mobilnych.
Niklas,
1
WebSQLSync działa bardzo dobrze z ponad 25 aplikacjami w produkcji (iOS i Android). WebSQL jest naprawdę świetny i szybki. Działa na iOS, Androidzie, Blackberry (chyba najnowsza wersja) i oczywiście na chrome i safari. Ale to nie działa w IE i Firefoxie, ponieważ API zostało zdeprecjonowane przez W3C ..
Samuel
W porządku, są tam zarówno pozytywne, jak i negatywne strony. Dzięki za podsumowanie!
Niklas
2
Czy masz coś podobnego oprócz localStorage, a nie WebSQL?