Offlinedatensynchronisierung
Anmerkung
Dieses Produkt wird eingestellt. Eine Ersetzung für Projekte mit .NET 8 oder höher finden Sie in der Community Toolkit Datasync-Bibliothek.
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 bietet 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:
- Avalonia: Offlinesynchronisierung aktivieren
- .NET MAUI: Offlinesynchronisierung aktivieren
- Uno-Plattform: Offlinesynchronisierung aktivieren
- Windows (UWP): Offlinesynchronisierung aktivieren
- Windows (WinUI3): Offlinesynchronisierung aktivieren
- Windows (WPF): Offlinesynchronisierung aktivieren
- Xamarin.Android: Offlinesynchronisierung aktivieren
- Xamarin.Forms: Offlinesynchronisierung aktivieren
- Xamarin.iOS: Offlinesynchronisierung aktivieren
Was ist eine Synchronisierungstabelle?
Die SdKs für Azure Mobile Apps bieten IRemoteTable<T>
, die direkt auf den Dienst zugreifen. 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 Store?
Ein lokaler Speicher ist die Datenpersistenzschicht auf dem Clientgerät. Die meisten Plattformen verwenden SQLite für den lokalen Speicher, aber iOS verwendet Core Data. Sie können auch Ihren eigenen lokalen Store 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 lokalen Änderungen
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();
Synchronisation
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 Pullvorgängen ausgeführt. Der Pullvorgang ruft geänderte Daten aus dem Dienst ab 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 Push hilft dabei, Konflikte zwischen Änderungen zu minimieren, die bereits in die Warteschlange gestellt wurden, und neue Daten vom Server. Sie können optional einen Push aller Tabellen konfigurieren, indem Sie PushOtherTables
in PullOptions
festlegen:
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. Zum 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-Tokenspeicher gespeichert. Der Delta-Token-Speicher wird als Tabelle im Offlinespeicher implementiert.
Leistung und Konsistenz
Die Synchronisierung wird manchmal vorzeitig beendet. Zum 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 größer als 25 verbessert die Leistung nicht erheblich.
Reinigend
Sie können den Inhalt des lokalen Speichers mithilfe von IOfflineTable<T>.PurgeItemsAsync
löschen. Das Löschen kann erforderlich sein, wenn Sie veraltete Daten in der Clientdatenbank haben oder alle ausstehenden Änderungen verwerfen möchten. Eine Bereinigung löscht eine Tabelle aus dem lokalen Speicher. 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 ein letztes Mittel zum Bereinigen einer Tabelle im Offlinespeicher, da alle Datensätze aus dem Cache gelöscht werden und sie erneut heruntergeladen werden müssen.