Synchronisieren von Offlinedaten

Die Offlinedatensynchronisierung ist ein SDK-Feature von Azure Mobile Apps. Daten werden in einem lokalen Speicher gespeichert. Wenn Ihre App offline ist, können Sie die Daten weiterhin erstellen, ändern und durchsuchen. Daten werden mit Ihrem Azure Mobile Apps-Dienst synchronisiert, wenn Ihr Gerät online ist. Das SDK unterstützt die Konfliktauflösung, wenn derselbe Datensatz sowohl auf dem Client als auch auf dem Dienst geändert wird.

Die Offlinesynchronisierung hat mehrere Vorteile:

  • Verbessert die Reaktionsfähigkeit der App
  • Verbessert die Zuverlässigkeit der App, wenn eine schlechte Netzwerkkonnektivität besteht.
  • Schränkt die Netzwerknutzung in netzwerken mit hoher Latenz oder getakteten Netzwerken ein
  • Unterstützt die getrennte Verwendung

In den folgenden Lernprogrammen wird gezeigt, wie Sie Ihren mobilen Clients mithilfe von Azure Mobile Apps Offlinesynchronisierung hinzufügen:

Was ist eine Synchronisierungstabelle?

Die SdKs für Azure Mobile Apps bieten IRemoteTable<T>einen direkten Zugriff auf den Dienst. Der Vorgang schlägt fehl, wenn das Gerät keine Netzwerkverbindung hat. Eine Synchronisierungstabelle (bereitgestellt von IOfflineTable<T>) stellt dieselben Vorgänge für einen lokalen Speicher bereit. Der lokale Speicher kann dann zu einem späteren Zeitpunkt mit dem Dienst synchronisiert werden. Bevor Sie Vorgänge ausführen, müssen Sie den lokalen Speicher initialisieren.

Was ist ein lokaler Speicher?

Ein lokaler Speicher ist die Datenpersistenzebene auf dem Clientgerät. Die meisten Plattformen verwenden SQLite als lokalen Speicher, aber iOS verwendet Core Data. Sie können auch Ihren eigenen lokalen Speicher implementieren. Verwenden Sie beispielsweise eine Version von SQLite mit SQLCipher, um einen verschlüsselten Speicher zu erstellen.

Wie funktioniert die Offlinesynchronisierung?

Der Clientcode steuert, wann lokale Änderungen mit einem Datensynchronisierungsdienst synchronisiert werden. Nichts wird an den Dienst gesendet, bis Sie lokale Änderungen übertragen . Ebenso wird der lokale Speicher nur dann mit neuen oder aktualisierten Daten aufgefüllt, wenn Sie Daten abrufen .

Sie können ausstehende Vorgänge für alle Tabellen, eine Liste von Tabellen oder eine Tabelle pushen:

// All tables
await client.PushTablesAsync();

// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);

// A single table
await table.PushItemsAsync();

Synchronization

Der Pushvorgang sendet alle ausstehenden Änderungen in der Vorgangswarteschlange an den Dienst. Die ausstehende Änderung wird über einen HTTP-REST-Aufruf an den Dienst gesendet, wodurch wiederum Die Datenbank geändert wird.

Pushvorgänge werden vor allen Pullvorgängen durchgeführt. Der Pullvorgang pullt geänderte Daten aus dem Dienst und speichert sie im lokalen Speicher.

Impliziter Push

Wenn Sie einen Pull für eine Tabelle ausführen, die über ausstehende lokale Updates verfügt, führt der Pull zuerst einen Push für diese Tabelle aus. Dieser Pushvorgang minimiert Konflikte zwischen Änderungen, die sich bereits in der Warteschlange befinden, und den neuen Daten vom Server. Sie können optional einen Push aller Tabellen konfigurieren, indem Sie Folgendes PullOptionsfestlegenPushOtherTables:

var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);

Ziehen einer Teilmenge von Datensätzen

Optional können Sie eine Abfrage angeben, die verwendet wird, um zu bestimmen, welche Datensätze in die Offlinedatenbank aufgenommen werden sollen. Beispiel:

var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);

Inkrementelle Synchronisierung

Azure Mobile Apps implementiert inkrementelle Synchronisierung. Nur Datensätze, die seit dem letzten Pullvorgang geändert wurden, werden abgerufen. Die inkrementelle Synchronisierung spart Zeit und Bandbreite, wenn Sie große Tabellen verarbeiten.

Für jede eindeutige Abfrage wird das UpdatedAt Feld des letzten erfolgreich übertragenen Datensatzes als Token im Offlinespeicher gespeichert. Der letzte UpdatedAt Wert wird im Delta-Token-Speicher gespeichert. Der Delta-Token-Speicher wird als Tabelle im Offlinespeicher implementiert.

Leistung und Konsistenz

Die Synchronisierung wird manchmal vorzeitig beendet. Beispiel:

  • Das Netzwerk, das Sie für die Synchronisierung verwenden, ist während des Synchronisierungsprozesses nicht verfügbar.
  • Sie erzwingen das Schließen der Anwendung während der Synchronisierung.

Um das Risiko eines Konsistenzproblems innerhalb der Offlinedatenbank zu minimieren, wird jeder Datensatz beim Empfang in die Datenbank geschrieben. Optional können Sie die Datensätze in Batches in die Datenbank schreiben. Batchvorgänge erhöhen die Leistung der Offlinedatenbankschreibvorgänge während des Pullvorgangs. Sie erhöhen jedoch auch das Risiko einer Inkonsistenz zwischen den Tabellenmetadaten und den Daten in der Tabelle.

Sie können das Intervall zwischen Schreibvorgängen wie folgt optimieren:

var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);

Dieser Code sammelt Schreibvorgänge in Batches von 25 Datensätzen. Leistungstests deuten darauf hin, dass die Leistung bis zu einem Wert von 25 verbessert wird. Ein WriteDeltaTokenInterval Wert, der größer als 25 ist, verbessert die Leistung nicht erheblich.

Löschen

Sie können den Inhalt des lokalen Speichers mithilfe IOfflineTable<T>.PurgeItemsAsyncvon . Das Löschen kann erforderlich sein, wenn Sie veraltete Daten in der Clientdatenbank haben, oder wenn Sie alle ausstehenden Änderungen Karte aufheben möchten. Beim Löschen wird eine Tabelle aus dem lokalen Speicher entfernt. So löschen Sie eine Tabelle:

await table.PurgeItemsAsync("", new PurgeOptions());

Die PurgeItemsAsync() Methode löst einen InvalidOperationException Fehler aus, wenn ausstehende Änderungen in der Tabelle vorliegen. In diesem Fall können Sie erzwingen, dass die Bereinigung erfolgt:

await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });

Das Löschen ist eine letzte Möglichkeit zum sauber Einer Tabelle im Offlinespeicher, da sie alle Datensätze aus dem Cache zurücksetzt und sie erneut herunterladen muss.