Il modo migliore per sincronizzare DB HTML5 locale (WebSQL Storage, SQLite) con un server (sincronizzazione a 2 vie) [chiuso]


151

Sto sviluppando un'applicazione Web mobile (per iPhone e Android) con un database locale (utilizzando Webstorage html5) in modo che la mia app sia ancora utilizzabile quando l'utente è offline.

Funziona perfettamente, ma voglio salvare i dati locali su un server. Quindi ho bisogno di sincronizzare il DB locale con un DB su un server. La sincronizzazione può essere solo un modo, ma in futuro vorrei sincronizzarla in entrambi i modi (server <-> DB locale).

Questo requisito sembra molto comune (o sarà comune in futuro per l'app Web mobile), ma non riesco a trovare una libreria che lo faccia.

So che Google lo sta facendo nella sua app Web mobile (es. Gmail) e ho trovato il progetto WSPL un progetto google ma senza fonte da scaricare.

Se non riesco a trovare una soluzione, creerò una libreria per farlo, poiché la sincronizzazione in un modo non sembra difficile, ma mi chiedo se ci sono altre soluzioni.


2
Non so se ci siano lib, ma il modo più semplice per farlo sembra archiviare il timestamp di modifica e trasferire le modifiche ai record più recenti rispetto ai record dall'altra parte, e anche trasferire aggiunte ed eliminazioni dall'ultima sincronizzazione. Potrebbe impazzire se gli orologi locali e del server non sono sincronizzati, ma ti verrà in mente qualcosa. - Pubblicare come commento poiché probabilmente non è molto utile e non ti fornisce una risposta.
Ivan Vučica,

Grazie Ivan. Hai ragione, se gli orologi locali e del server non sono sincronizzati, potrebbe essere disordinato ... Ho appena scoperto che: quickconnect.pbworks.com/Using-Enterprise-Synchronization Dice che può sincronizzare un DB HTML 5 locale con un DB in un server. Ho bisogno di uno sguardo più approfondito su questo, e vedere se può funzionare al di fuori del Framework QuickConnect ...
Samuel

Ho trovato un'altra soluzione: impel.simulacre.org/blog/… Sembra fantastico, ma dovrai usare la libreria Mootools e Impel ORM ...
Samuel

1
Che ne dici di CouchDB? couchdb.apache.org
julianm,

4
Gli argomenti sono per discussioni , Stack Exchange è per domande . A un certo punto i messaggi come questo sono stati accettati su Stack Exchange, ma non più.
casperOne

Risposte:


70
  • Ho creato una piccola libreria JS denominata WebSqlSync per sincronizzare un DB WebSql locale con un server (client <-> server). Molto facile da usare e da integrare nel tuo codice:

https://github.com/orbitaloop/WebSqlSync

  • Il progetto open source QuickConnect contiene una libreria JS per sincronizzare il DB SQLite HTML5 locale con un DB server (MySQL o altro):

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

Per utilizzare questa libreria, è necessario utilizzare DataAccessObject del framework per accedere al proprio DB. Funziona archiviando tutte le richieste SQL applicate al DB (tranne selezionare ovviamente) e inviandole al server. È fantastico gestire la cancellazione, ma è un po 'pesante se hai molti aggiornamenti e il server deve usare lo stesso linguaggio SQL ...

  • Un altro progetto di QuickConnect è una sincronizzazione SQLite nativa (in Obiettivo C per iOS o Mac OS e in Java per Android):

http://www.quickconnectfamily.org/qcdbsync/ (penso che memorizzi anche la cronologia di tutte le richieste SQL)

  • E ho appena trovato un'altra promettente libreria JS: persistenceJS

https://github.com/zefhemel/persistencejs

"persistence.js è una libreria mappatore relazionale di oggetti Javascript asincrona. Puoi usarla nel browser, così come sul server (e puoi condividere modelli di dati tra di loro)."

Hanno un modulo di sincronizzazione DB: DOC di persistence.synch.js

(funziona con HTML5 DB SQLite o Google Gears sul client e MySQL sul server)

  • E c'è anche Impel.inTouch . Sembra molto facile da usare (con file php inclusi), ma è necessario utilizzare il framework Mootools sul lato client:

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

  • Sencha ha anche un servizio di sincronizzazione: Sencha.io . Sembra fantastico, ma dipende dal framework Sencha Touch:

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


Ciao Samuel, la js lib ha funzionato per te?
Mathias Conradt,

La sincronizzazione DB non è la mia priorità per ora, quindi mi arrendo e aspetto una soluzione più standard e solida ...
Samuel,

3
Dopo averli testati tutti, penso che svilupperò la mia piccola libreria JS per sincronizzare WebSQL con un DB del server. Sarà una doppia sincronizzazione (server <-> locale) e non avrà alcuna dipendenza. Pubblicherò qui il link al codice una volta terminato
Samuel

2
Ho eseguito il commit della prima versione della mia soluzione di sincronizzazione denominata WebSqlSync: github.com/orbitaloop/WebSqlSync (vedi risposta sotto)
Samuel

1
Ciao ragazzi, ho avviato un plugin persistencejs per una sincronizzazione riposante. È ancora in fase di sviluppo, ma se qualcuno vuole verificarlo: github.com/robertokl/persistencejs e un esempio funzionante sul lato server / client con ruby ​​su binari: github.com/robertokl/persistencejs-restfulSync-example
robertokl

18

Ho sviluppato una soluzione di sincronizzazione generica denominata WebSqlSync .

Non dipende da alcun framework. È disponibile qui: https://github.com/orbitaloop/WebSqlSync

Estratto del file README:

WebSqlSync

Sincronizza automaticamente un database WebSql locale (SQLite nel navigatore) con un server. (Sincronizzazione a 2 vie: client <-> server)

Molto facile da integrare nella tua app esistente e molto facile da usare (2 funzioni da chiamare: initSync e syncNow)

uso

Inizializzare

È necessario inizializzare la libreria (ad esempio ad ogni avvio).

Creerà automaticamente 2 tabelle (se non esistono già, una per memorizzare tutti gli elementi nuovi o modificati (tabella new_elem) e una per memorizzare la data dell'ultima sincronizzazione (tabella sync_info). Creerà anche i trigger SQLite in per guardare INSERT o UPDATE sulle tabelle che si desidera sincronizzare (per inserire automaticamente gli elementi modificati nella tabella new_elem):

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

Dove TABLES_TO_SYNC è l'elenco di tabelle che si desidera sincronizzare con il server, ad esempio:

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

Sincronizzare

Per avviare la sincronizzazione, è necessario chiamare la funzione syncNow. Puoi chiamarlo ogni X secondi o dopo alcune modifiche, ad esempio:

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

E questo è tutto ciò che devi fare sul client. Sul lato server, dovrai codificare la tua soluzione (ma non è complicata). E ci sono alcuni esempi inPHP e Java. Ancora una volta, i contributi sono benvenuti.


Quanto bene diresti che ha funzionato per te, riassumendolo un anno dopo? Sto cercando un buon DB lato client che funzioni per browser e unità mobili.
Niklas,

1
WebSQLSync funziona molto bene con oltre 25 app in produzione (iOS e Android). WebSQL è davvero eccezionale e veloce. Funziona su iOS, Android, Blackberry (l'ultima versione credo) e ovviamente Chrome e Safari. Ma non funziona su IE e Firefox, perché l'API è stata deprezzata dal W3C ..
Samuel

Bene, sia positivi che negativi lì. Grazie per il riassunto!
Niklas

2
Hai qualcosa di simile ma per localStorage e non WebSQL?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.