Beste Möglichkeit, die lokale HTML5-Datenbank (WebSQL Storage, SQLite) mit einem Server zu synchronisieren (2-Wege-Synchronisierung) [geschlossen]

151

Ich entwickle eine mobile Webanwendung (für iPhone und Android) mit einer lokalen Datenbank (unter Verwendung von HTML5-Webstorage), sodass meine App weiterhin verwendet werden kann, wenn der Benutzer offline ist.

Dies funktioniert einwandfrei, aber ich möchte die lokalen Daten auf einem Server speichern. Ich muss also die lokale Datenbank mit einer Datenbank auf einem Server synchronisieren. Die Synchronisation kann nur in eine Richtung erfolgen, aber in Zukunft möchte ich sie in beide Richtungen synchronisieren (Server <-> lokale Datenbank).

Diese Anforderung sieht sehr häufig aus (oder wird in Zukunft für mobile Web-Apps üblich sein), aber ich kann keine Bibliothek finden, die dies tut.

Ich weiß, dass Google dies in seiner mobilen Web-App (z. B. Google Mail) tut, und ich fand, dass das WSPL-Projekt ein Google-Projekt ist, jedoch ohne Quelle zum Herunterladen.

Wenn ich keine Lösung finde, werde ich eine Bibliothek erstellen, um dies zu tun, da die Einweg-Synchronisierung nicht schwierig aussieht, aber ich frage mich, ob es andere Lösungen gibt.

Samuel
quelle
2
Ich weiß nicht, ob es Bibliotheken gibt, aber der einfachste Weg, dies zu tun, scheint darin zu bestehen, den Zeitstempel für Änderungen zu speichern, Änderungen an Datensätze zu übertragen, die neuer als die Datensätze auf der anderen Seite sind, und auch Hinzufügungen und Löschungen seit der letzten Synchronisierung zu übertragen. Es kann verrückt werden, wenn lokale und Serveruhren nicht synchron sind, aber Sie werden an etwas denken. - Als Kommentar posten, da es wahrscheinlich nicht sehr hilfreich ist und Ihnen keine Antwort gibt.
Ivan Vučica
Danke Ivan. Sie haben Recht, wenn die lokale Uhr und die Serveruhr nicht synchron sind, kann dies unübersichtlich sein ... Ich habe gerade Folgendes festgestellt: quickconnect.pbworks.com/Using-Enterprise-Synchronization Es heißt, dass eine lokale HTML 5- Datenbank mit a synchronisiert werden kann DB in einem Server. Ich muss mir das genauer ansehen und sehen, ob es außerhalb des QuickConnect Frameworks ausgeführt werden kann ...
Samuel
Ich habe eine andere Lösung gefunden: impel.simulacre.org/blog/… Sieht gut aus, aber Sie müssen die Mootools-Bibliothek und das Impel ORM verwenden ...
Samuel
1
Wie wäre es mit CouchDB? couchdb.apache.org
julianm
4
Themen sind für Diskussionen , Stack Exchange ist für Fragen . Zu einem bestimmten Zeitpunkt wurden solche Beiträge in Stack Exchange akzeptiert, jedoch nicht mehr.
CasperOne

Antworten:

70
  • Ich habe eine kleine JS- Bibliothek mit dem Namen WebSqlSync erstellt , um eine lokale WebSql-Datenbank mit einem Server (Client <-> Server) zu synchronisieren. Sehr einfach zu bedienen und in Ihren Code zu integrieren:

https://github.com/orbitaloop/WebSqlSync

  • Das Open Source-Projekt QuickConnect enthält eine JS-Bibliothek zum Synchronisieren der lokalen HTML5-SQLite-Datenbank mit einer Server-Datenbank (MySQL oder andere):

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

Um diese Bibliothek zu verwenden, müssen Sie das DataAccessObject des Frameworks verwenden, um auf Ihre Datenbank zuzugreifen. Es speichert alle auf die Datenbank angewendeten SQL-Anforderungen (außer natürlich select) und sendet sie an den Server. Es ist großartig, das Löschen zu verwalten, aber es ist ein wenig schwierig, wenn Sie viele Updates haben und der Server dieselbe SQL-Sprache verwenden muss ...

  • Ein weiteres Projekt von QuickConnect ist eine native SQLite-Synchronisierung (in Objective C für iOS oder Mac OS und in Java für Android):

http://www.quickconnectfamily.org/qcdbsync/ (Ich denke, es speichert auch den Verlauf aller SQL-Anforderungen)

  • Und ich habe gerade eine andere vielversprechende JS-Bibliothek gefunden: persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js ist eine asynchrone objektrelationale Javascript-Mapper-Bibliothek. Sie können sie sowohl im Browser als auch auf dem Server verwenden (und Datenmodelle zwischen ihnen austauschen)."

Sie haben ein DB-Synchronisationsmodul: DOC von persistence.synch.js

(funktioniert mit HTML5 DB SQLite oder Google Gears auf dem Client und MySQL auf dem Server)

  • Und es gibt auch Impel.inTouch . Es sieht sehr einfach aus (mit eingeschlossenen PHP-Dateien), aber Sie müssen das Mootools-Framework auf der Clientseite verwenden:

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

  • Sencha hat auch einen Synchronisationsdienst: Sencha.io . Sieht gut aus, ist aber vom Sencha Touch-Framework abhängig:

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

Samuel
quelle
Hallo Samuel, hat die js lib für dich geklappt?
Mathias Conradt
Die DB-Synchronisierung ist momentan nicht meine Priorität, deshalb gebe ich einfach auf und warte auf eine standardmäßigere und robustere Lösung ...
Samuel
3
Nachdem ich alle getestet habe, denke ich, dass ich meine eigene kleine JS-Bibliothek entwickeln werde, um WebSQL mit einer Server-DB zu synchronisieren. Es handelt sich um eine Doppelsynchronisation (lokaler <-> Server), die keine Abhängigkeit aufweist. Ich werde hier den Link zum Code posten, sobald er fertig ist
Samuel
2
Ich habe die erste Version meiner eigenen Synchronisierungslösung mit dem Namen WebSqlSync festgeschrieben: github.com/orbitaloop/WebSqlSync (siehe unten stehende Antwort)
Samuel
1
Hallo Leute, ich habe ein Persistencejs-Plugin für eine erholsame Synchronisation gestartet. Es befindet sich noch in der Entwicklung, aber wenn jemand es ausprobieren möchte: github.com/robertokl/persistencejs und ein funktionierendes Beispiel auf Server- / Client-Seite mit Ruby on Rails: github.com/robertokl/persistencejs-restfulSync-example
robertokl
18

Ich habe eine generische Synchronisierungslösung namens WebSqlSync entwickelt .

Es ist nicht abhängig von einem Framework. Es ist hier verfügbar: https://github.com/orbitaloop/WebSqlSync

Auszug aus der README-Datei:

WebSqlSync

Synchronisieren Sie automatisch eine lokale WebSQL-Datenbank (SQLite im Navigator) mit einem Server. (2-Wege-Synchronisierung: Client <-> Server)

Sehr einfach in Ihre bestehende App zu integrieren und sehr einfach zu bedienen (2 Funktionen zum Aufrufen: initSync und syncNow)

Verwendung

Initialisieren

Sie müssen die Bibliothek initialisieren (zum Beispiel bei jedem Start).

Es werden automatisch 2 Tabellen erstellt (sofern diese noch nicht vorhanden sind, eine zum Speichern aller neuen oder geänderten Elemente (Tabelle new_elem) und eine zum Speichern des Datums der letzten Synchronisierung (Tabelle sync_info). Außerdem werden SQLite-Trigger in erstellt Um INSERT oder UPDATE für die zu synchronisierenden Tabellen zu beobachten (um die geänderten Elemente automatisch in die Tabelle new_elem einzufügen):

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

Wobei TABLES_TO_SYNC die Liste der Tabellen ist, die Sie mit dem Server synchronisieren möchten, z.

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

Synchronisieren

Um die Synchronisation zu starten, müssen Sie die Funktion syncNow aufrufen. Sie können es alle X Sekunden oder nach einigen Änderungen aufrufen, zum Beispiel:

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

Und das ist alles, was Sie auf dem Client tun müssen. Auf der Serverseite müssen Sie Ihre eigene Lösung codieren (dies ist jedoch nicht kompliziert). Und es gibt einige Beispiele in PHP & Java. Auch hier sind Beiträge willkommen.

Samuel
quelle
Wie gut hat das für Sie funktioniert und ein Jahr später zusammengefasst? Ich suche eine gute clientseitige Datenbank, die für Browser und mobile Einheiten funktioniert.
Niklas
1
WebSQLSync funktioniert sehr gut mit mehr als 25 Apps in der Produktion (iOS und Android). WebSQL ist wirklich großartig und schnell. Es funktioniert auf iOS, Android, Blackberry (die neueste Version, denke ich) und natürlich auf Chrome und Safari. Aber es funktioniert nicht auf IE und Firefox, weil die API von W3C abgeschrieben wurde.
Samuel
Okay, sowohl positive als auch negative. Danke für die Zusammenfassung!
Niklas
2
Haben Sie etwas Ähnliches außer für localStorage und nicht für WebSQL?