2013-08-27 18 views
5

La situazione: Ho un database e un'app Web che interagiscono per visualizzare e aggiornare tabelle di dati scientifici. Il mio compito è quello di costruire un'applicazione mobile che permetterà agli utenti diAutenticazione/sincronizzazione database offline/online da jQuery Mobile

  1. Autentica e identificarsi non in linea di rilevamento scopi (usando predefiniti ma dinamici user-account e le autorizzazioni memorizzati nella cache)
  2. Scarica Identification Data per lavoro nel campo (con connessione internet)
  3. effettuare e memorizzare le osservazioni sul campo (senza accesso a internet)
  4. Sincronizzare Osservazioni in un database online in un secondo momento

La domanda: Qual è il modo migliore per eseguire l'autenticazione/download/archiviazione/caricamento dei dati necessari per amministrare tale applicazione indipendentemente dall'accesso a Internet coerente? Se due persone modificano la stessa lettura e un aggiornamento avviene tra le sincronizzazioni, come faccio a tenere traccia di quali tabelle e valori sono stati modificati e di evitare che le modifiche vengano perse?

Il treno corrente di pensiero: mio attuale strategia sperimentale per il controllo di collisione per mantenere una tabella di "Sync" che memorizza oggetti JSON che rappresentano ogni transazione database on-line memorizzata in sessionStorage e avere l'applicazione verificando continuamente il suo sincronizzazione prima di caricare i dati e controllando questo oggetto per potenziali collisioni sugli aggiornamenti di chiavi primarie specifiche. Mi piacerebbe essere in grado di bloccare le tuple quando sono in fase di editing, ma ciò sembra impossibile con l'accesso a Internet incoerente.

Scusate se questo è un po 'di una domanda newb, Sono nuovo a tutto il cellulare cosa lo sviluppo di applicazioni ...

tl; dr Come posso prevenire modifiche asincrone al database da applicazioni mobili che va avanti e offline da sovrascrittura/collisione con le modifiche di un altro individuo allo stesso database? E come posso autenticare gli utenti senza una connessione di rete?

+0

La concorrenza è un problema con molte applicazioni e database. C'è solo una differenza maggiore nel pubblicare e la tecnologia con il cellulare, ma non è poi così diverso. – JeffO

+1

@JeffO in realtà non rispondi alle mie domande .. la concorrenza e le collisioni di dati sono un problema che ho identificato, è vero, ma che dire? – XaxD

risposta

2

Per quanto riguarda la sincronizzazione si potrebbe avere uno sguardo a jIO - un open - La libreria di risorse su cui stiamo lavorando può sincronizzare i documenti JSON tra diversi tipi di storage e ha un'API super-semplice.

Ci sono un sacco di connettori disponibili e in lavorazione (webDav, S3, xwiki, ecc.) E puoi anche scrivere il tuo connettore per collegare JIO a qualsiasi fonte di dati JSON.

Poi sul client è possibile ad esempio impostare un'archiviazione replica-revisione utilizzando il localhost cliente e lo storage remoto come depositi:

var jio_instance = jIO.newJio({ 
    "type": "replicaterevision", 
    "storage_list": [{ 
    "type": "revision", 
    "sub_storage": {<storage spec for your localhost storage>} 
    }, { 
    "type": "revision", 
    "sub_storage": {<storage spec for your remote storage>} 
    }] 
}); 

Tutti i depositi del storage_list verrà automaticamente di versione e sincronizzato. Quindi, se un utente è offline, recupera un documento, lo modifica e lo salva (solo per la registrazione locale, poiché l'utente non è in linea), jIO genererà un conflitto la prossima volta che l'utente tenta di accedere al file quando è online, perché la versione corrente è attiva remote-storage e localstorage differiscono.

Quindi si tratta solo di scrivere una routine per risolvere eventuali conflitti derivanti da più utenti che modificano documenti mentre sono online/offline = quale versione conservare/unire/etc.

L'accesso ai documenti è abbastanza semplice. documenti JSON hanno metadati e attachements ed è possibile utilizzare i seguenti comandi per modificare i documenti JSON:

POST > generate a new document 
    PUT > update existing document 
    GET > retrieve a document 
    REMOVE > delete a document 
    ALLDOCS > retrieve all documents 
    PUTATTACHEMENT > add an attachment to a document 
    GETATTACHEMENT > retrieve an attachment from a document 
    REMOVEATTACHEMENT > delete an attachement from a document 

callable come questo:

jio_instance.get({"_id":"your_doc_id"}, function (err, response) { 
    // do something 
    }); 

JIO ha anche un modulo complex-queries, che permette di eseguire banca dati come le domande sui tuoi depositi. Quindi puoi fare qualcosa del genere:

options = { 
query: '(author:"% Doe") AND (format:"pdf")', 
limit: [0, 100], 
sort_on: [['last_modified', 'descending'], ['creation_date', 'descending']], 
select_list: ['title'], 
wildcard_character: '%' 
}; 

// run query 
jio_instance.allDocs(options, function (error, response) { 
    // do sth 
}); 

Fatemi sapere se avete domande.

2

Avete sentito parlare di "race condition" [1] in termini di chiamate Ajax? Esiste una soluzione [2], in cui è possibile effettuare le chiamate ajax al server sequenziale anziché concomitante e quindi vengono eseguite in sequenza dopo l'una e l'altra. Funziona con una connessione asincrona, quindi qualsiasi altra cosa di sincronizzazione non è necessaria.

Il trucco qui è utilizzare jQuery ajaxQueue [3] per questo scopo.

Le mie fonti:

[1] http://en.wikipedia.org/wiki/Race_condition

[2] How to make all AJAX calls sequential?

[3] http://plugins.jquery.com/ajaxqueue/

2

Per l'autenticazione dell'utente, mentre non sono collegati alla rete io vi suggerisco il seguente percorso:

Al punto # 2 che si sta scaricando i dati di identificazione tramite connessione internet. Quindi, ovviamente, dovrai salvare la coppia di nomi utente e password in un formato crittografato all'interno della memoria locale. Questa è l'unica cosa che ti aiuterà durante l'autenticazione dello stesso utente sullo stesso dispositivo mentre accederai all'applicazione in un'area remota, ad esempio in modalità offline. In definitiva i dispositivi portatili sono per utente e la tua applicazione manterrà la cronologia solo di quell'utente; che penso sia assolutamente perfetto in questo scenario.

Per evitare collisioni; suggerirò di aumentare il numero di volte in cui il dispositivo verrà sincronizzato con il server principale. Se gli utenti sono in rete e apportano alcune modifiche ai dati, l'operazione di sincronizzazione in background dovrebbe sincronizzare tali modifiche con il server principale e gli altri utenti dovrebbero eseguire la sincronizzazione dopo intervalli predefiniti. Più tempo sincronizzi i dati; minori sono le probabilità di conflitti. Ma ancora una volta la domanda rimane sulla modifica avvenuta ai dati mentre l'utente è in modalità offline. Per questo non possiamo fare nulla. Il tuo codice di gestione dei conflitti dovrebbe avere un po 'di intelligenza come la copia dei dati dovrebbe avere più preferenze, cioè i dati provenienti da X utente con un ruolo di sicurezza O dati provenienti da utente Y con ruolo di sicurezza B o qualcosa del genere.