5

die Situation: ich eine Datenbank und eine Web-App haben, die Tabellen der wissenschaftlichen Daten anzuzeigen und zu aktualisieren interagieren. Meine Aufgabe ist es, eine mobile Anwendung zu erstellen, die Benutzer zuOffline/Online-Datenbank Authentifizierung/Synchronisation von jQuery Mobile

  1. Authentifizieren ermöglicht und identifizieren sie offline für Tracking-Zwecke (unter Verwendung von vordefinierten, aber dynamischen Benutzerkonten und im Cache gespeicherten Erlaubnissen)
  2. Download-Identifikationsdaten für Arbeiten auf dem Gebiet (mit Internetzugang)
  3. Fabrikat und Shop Beobachtungen im Feld (ohne Internetzugang)
  4. Beobachtungen Synchronisieren in eine Online-Datenbank zu einem späteren Zeitpunkt

Die Frage: Was ist der beste Weg zum Authentifizieren/Herunterladen/Speichern/Hochladen der notwendigen Daten für die Verwaltung einer solchen Anwendung unabhängig von konsistentem Internetzugang? Wenn zwei Personen denselben Messwert anpassen und zwischen den Synchronisationen ein Update stattfindet, wie kann ich verfolgen, welche Tabellen und Werte geändert wurden, und verhindern, dass die Änderungen verloren gehen?

Der aktuelle Zug des Gedankens: Meine aktuelle vorläufige Strategie zur Kollisionskontrolle einer „Sync“ Tabelle zu pflegen, die JSON-Objekte speichert jede Online-Datenbanktransaktion in sessionstorage gespeichert darstellen und hat die App ihre Sync kontinuierlich überprüfen vor den Heraufladen von Daten und überprüfen dieses Objekt auf mögliche Kollisionen bei Updates auf bestimmte Primärschlüssel. Ich möchte in der Lage sein, Tupel zu sperren, wenn sie sich in einer Bearbeitungsphase befinden, aber das scheint bei inkonsistentem Internetzugang unmöglich zu sein.

Sorry, wenn dies ein bisschen ein newb Frage ist, ich bin neu in der ganzen mobile app Entwicklung Sache ...

tl; dr Wie kann ich asynchrone Änderungen an der Datenbank von mobilen Anwendungen verhindern Das geht online und offline durch Überschreiben/kollidieren mit anderen Änderungen in der gleichen Datenbank? Und wie authentifiziere ich Benutzer ohne eine Netzwerkverbindung?

+0

Concurrency ist ein Problem bei vielen Anwendungen und databasess. Es gibt nur eine längere Lücke im Posting und die Technologie mit dem Handy, aber das ist nicht so anders. – JeffO

+1

@JeffO Sie beantworten nicht wirklich meine Fragen .. Parallelität und Datenkollisionen sind ein Problem, das ich festgestellt haben, das ist wahr, aber was davon? – XaxD

Antwort

2

Wie Synchronisierung Sie einen Blick auf jIO haben könnte - eine offene -Source-Bibliothek, an der wir arbeiten, kann JSON-Dokumente über verschiedene Arten von Speichern synchronisieren und verfügt über eine sehr einfache API.

Es gibt eine Reihe von Konnektoren verfügbar und bearbeitet (WebDav, S3, Xwiki, etc) und Sie können auch Ihren eigenen Konnektor schreiben, um JIO dort anzuschließen, wo Sie Ihre JSON-Daten liefern.

Dann auf dem Client können Sie zum Beispiel einen Replikat-Revision Speicher mit dem Client localhost und Ihren Remote-Speicher als Speicher einzurichten:

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>} 
    }] 
}); 

Alle Einlagerungen im storage_list automatisch versioniert und synchronisiert werden. Also, wenn ein Benutzer offline ist, ruft ein Dokument, bearbeitet und speichert sie (nur auf localstorage als Benutzer offline ist), Jio wird ein Konflikt das nächste Mal werfen der Benutzer die Datei zuzugreifen versucht, wenn Sie online sind, weil die aktuelle Version auf remote-storage und localstorage unterscheiden sich.

Dann ist es nur noch eine Frage eine Routine zu schreiben, um Konflikte zu lösen, von mehreren Benutzern entstehen, die Bearbeitung von Dokumenten, während Sie online sein/offline = welche Version/merge zu halten/etc.

Zugang zu Dokumenten ist recht unkompliziert. JSON Dokumente Metadaten und Attachements und Sie können die folgenden Befehle verwenden, um Ihre JSON-Dokumente zu ändern:

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 

aufrufbar wie folgt aus:

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

JIO hat auch ein complex-queries-Modul, das Datenbank laufen zu lassen wie Abfragen auf Ihren Speichern. So könnte man so etwas tun:

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 
}); 

Lassen Sie mich wissen, wenn Sie Fragen haben.

2

Haben Sie von "Race Condition" [1] in Bezug auf Ajax Anrufe gehört? Es gibt eine Lösung [2], wie Sie Ihre Ajax Aufrufe an Ihren Server sequentiell statt gleichzeitig machen können und sie nacheinander nacheinander ausgeführt werden. Dies funktioniert mit einer asynchronen Verbindung, so dass keine andere Synchronisierung erforderlich ist.

Der Trick hier ist die Verwendung von jQuery ajaxQueue [3] für diesen Zweck.

Meine Quellen:

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

[2] How to make all AJAX calls sequential?

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

2

Für die Benutzerauthentifizierung, während nicht mit dem Netzwerk verbunden i Pfad folgend wird vorschlagen:

In Punkt 2 Sie Identifikationsdaten über das Internet Zugang herunterladen. Natürlich müssen Sie Benutzername und Passwort in einem verschlüsselten Format im lokalen Speicher speichern. Das ist nur eine Sache, die Ihnen bei der Authentifizierung des gleichen Benutzers auf demselben Gerät hilft, während Sie auf die Anwendung im Remote-Bereich zugreifen, also im Offline-Modus. Letztendlich sind handgehaltene Geräte pro Benutzer und Ihre Anwendung speichert nur die Geschichte dieses Benutzers; was ich in einem solchen Szenario absolut gut finde.

Für Kollision zu vermeiden; Ich werde vorschlagen, wie oft das Gerät mit dem Hauptserver synchronisiert wird. Wenn sich die Benutzer im Netzwerk befinden und einige Änderungen an den Daten vornehmen, sollten diese Änderungen im Hintergrundsynchronisierungsvorgang mit dem Hauptserver synchronisiert werden und andere Benutzer sollten nach vordefinierten Intervallen synchronisiert werden. Mehr die Zeit, die Sie die Daten synchronisieren; Geringer sind die Chancen von Konflikten. Aber wieder bleibt die Frage über die Änderung, die mit Daten passiert, während sich der Benutzer im Offline-Modus befindet. Dafür können wir nichts machen. Ihr Konfliktverwaltungscode sollte eine gewisse Intelligenz aufweisen, wie z. B. welche Kopie von Daten bevorzugter sein sollte, d. H. Daten, die von einem X-Benutzer mit einer Sicherheitsrolle kommen ODER Daten von einem Y-Benutzer mit B-Sicherheitsrolle oder ähnlichem.