Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Überblick
In diesem Lernprogramm wird das Offlinesynchronisierungsfeature von Azure Mobile Apps für Xamarin.Forms vorgestellt. Die Offlinesynchronisierung ermöglicht Es Endbenutzern, mit einer mobilen App zu interagieren – selbst wenn keine Netzwerkverbindung besteht. Änderungen werden in einer lokalen Datenbank gespeichert. Sobald das Gerät wieder online ist, werden diese Änderungen mit dem Remotedienst synchronisiert.
Dieses Lernprogramm basiert auf der Schnellstartlösung Xamarin.Forms für mobile Apps, die Sie erstellen, wenn Sie das Lernprogramm [Erstellen einer Xamarin iOS-App] abschließen. Die Schnellstartlösung für Xamarin.Forms enthält den Code zur Unterstützung der Offlinesynchronisierung, der nur aktiviert werden muss. In diesem Lernprogramm aktualisieren Sie die Schnellstartlösung, um die Offlinefeatures von Azure Mobile Apps zu aktivieren. Außerdem heben wir den offlinespezifischen Code in der App hervor. Wenn Sie die heruntergeladene Schnellstartlösung nicht verwenden, müssen Sie dem Projekt die Datenzugriffserweiterungspakete hinzufügen. Weitere Informationen zu Servererweiterungspaketen finden Sie unter Arbeiten mit dem .NET-Back-End-Server-SDK für Azure Mobile Apps.
Weitere Informationen zum Offlinesynchronisierungsfeature finden Sie im Thema Offlinedatensynchronisierung in Azure Mobile Apps.
Aktivieren der Offlinesynchronisierungsfunktionalität in der Schnellstartlösung
Der Offlinesynchronisierungscode ist im Projekt mithilfe von C#-Präprozessordirektiven enthalten. Wenn das OFFLINE_SYNC_ENABLED-Symbol definiert ist, sind diese Codepfade im Build enthalten. Für Windows-Apps müssen Sie auch die SQLite-Plattform installieren.
Klicken Sie in Visual Studio mit der rechten Maustaste auf die Projektmappe >NuGet-Pakete für Projektmappe verwalten..., und installieren Sie dann das Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-Paket für alle Projekte in der Projektmappe.
Öffnen Sie im Projektmappen-Explorer die Datei TodoItemManager.cs aus dem Projekt mit Portable im Namen, das ein Projekt einer portablen Klassenbibliothek ist, und kommentieren Sie dann die folgende Präprozessordirektive aus:
#define OFFLINE_SYNC_ENABLED(Optional) Um Windows-Geräte zu unterstützen, installieren Sie eines der folgenden SQLite-Laufzeitpakete:
Windows 8.1-Runtime: Installieren Sie SQLite für Windows 8.1.
Windows Phone 8.1: Installieren Sie SQLite für Windows Phone 8.1.
Universelle Windows-Plattform Installieren Sie SQLite für die universelle Windows-Plattform.
Obwohl die Schnellstartanleitung kein universelles Windows-Projekt enthält, wird die universelle Windows-Plattform mit Xamarin Forms unterstützt.
(Optional) Klicken Sie in jedem Windows-App-Projekt mit der rechten Maustaste auf "Verweise>hinzufügen" ..., erweitern Sie die Windows-Ordnererweiterungen >. Aktivieren Sie das entsprechende SQLite für Windows SDK zusammen mit der Visual C++ 2013-Runtime für Windows SDK. Die SQLite SDK-Namen variieren geringfügig bei jeder Windows-Plattform.
Überprüfen des Clientsynchronisierungscodes
Im Folgenden finden Sie eine kurze Übersicht darüber, was bereits im Lernprogrammcode innerhalb der #if OFFLINE_SYNC_ENABLED Direktiven enthalten ist. Die Offlinesynchronisierungsfunktionalität befindet sich in der TodoItemManager.cs Projektdatei im Projekt "Portable Class Library". Eine konzeptionelle Übersicht über das Feature finden Sie unter Offlinedatensynchronisierung in Azure Mobile Apps.
Bevor Tabellenvorgänge ausgeführt werden können, muss der lokale Speicher initialisiert werden. Die lokale Speicherdatenbank wird im TodoItemManager-Klassenkonstruktor mithilfe des folgenden Codes initialisiert:
var store = new MobileServiceSQLiteStore(OfflineDbPath); store.DefineTable<TodoItem>(); //Initializes the SyncContext using the default IMobileServiceSyncHandler. this.client.SyncContext.InitializeAsync(store); this.todoTable = client.GetSyncTable<TodoItem>();Dieser Code erstellt eine neue lokale SQLite-Datenbank mit der MobileServiceSQLiteStore-Klasse .
Die DefineTable-Methode erstellt eine Tabelle im lokalen Speicher, die den Feldern im angegebenen Typ entspricht. Der Typ muss nicht alle Spalten enthalten, die sich in der Remotedatenbank befinden. Es ist möglich, eine Teilmenge von Spalten zu speichern.
Das TodoTable-Feld in TodoItemManager ist ein IMobileServiceSyncTable-Typ anstelle von IMobileServiceTable. Diese Klasse verwendet die lokale Datenbank für alle CruD-Tabellenvorgänge (Create, Read, Update, Delete). Sie entscheiden, wann diese Änderungen an das Mobile App-Back-End übertragen werden, indem Sie PushAsync auf dem IMobileServiceSyncContext aufrufen. Der Synchronisierungskontext trägt dazu bei, Tabellenbeziehungen beizubehalten, indem Änderungen in allen Tabellen nachverfolgt und verschoben werden, die eine Client-App geändert hat, wenn PushAsync aufgerufen wird.
Die folgende SyncAsync-Methode wird aufgerufen, um mit dem Mobilen App-Back-End zu synchronisieren:
public async Task SyncAsync() { ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null; try { await this.client.SyncContext.PushAsync(); await this.todoTable.PullAsync( "allTodoItems", this.todoTable.CreateQuery()); } catch (MobileServicePushFailedException exc) { if (exc.PushResult != null) { syncErrors = exc.PushResult.Errors; } } // Simple error/conflict handling. if (syncErrors != null) { foreach (var error in syncErrors) { if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null) { //Update failed, reverting to server's copy. await error.CancelAndUpdateItemAsync(error.Result); } else { // Discard local change. await error.CancelAndDiscardItemAsync(); } Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]); } } }In diesem Beispiel wird die einfache Fehlerbehandlung mit dem Standardsynchronisierungshandler verwendet. Eine echte Anwendung behandelt die verschiedenen Fehler wie Netzwerkbedingungen und Serverkonflikte mithilfe einer benutzerdefinierten IMobileServiceSyncHandler-Implementierung .
Überlegungen zur Offlinesynchronisierung
Im Beispiel wird die SyncAsync-Methode nur beim Start aufgerufen und wenn eine Synchronisierung angefordert wird. Um eine Synchronisierung in einer Android- oder iOS-App zu initiieren, ziehen Sie die Elementliste nach unten; für Windows verwenden Sie die Schaltfläche " Synchronisieren ". In einer realen Anwendung können Sie die Synchronisierung auch auslösen, wenn sich der Netzwerkzustand ändert.
Wenn ein Pull für eine Tabelle ausgeführt wird, die über ausstehende lokale Updates verfügt, die vom Kontext nachverfolgt werden, löst dieser Pullvorgang automatisch einen vorherigen Kontext-Push aus. Beim Aktualisieren, Hinzufügen und Abschließen von Elementen in diesem Beispiel können Sie den expliziten PushAsync-Aufruf weglassen.
Im bereitgestellten Code werden alle Datensätze in der Remote-TodoItem-Tabelle abgefragt, aber es ist auch möglich, Datensätze durch Übergeben einer Abfrage-ID und Abfrage an PushAsync zu filtern. Weitere Informationen finden Sie im Abschnitt "Inkrementelle Synchronisierung in Offlinedatensynchronisierung in Azure Mobile Apps".
Ausführen der Client-App
Wenn die Offlinesynchronisierung jetzt aktiviert ist, führen Sie die Clientanwendung mindestens einmal auf jeder Plattform aus, um die lokale Speicherdatenbank aufzufüllen. Simulieren Sie später ein Offlineszenario, und ändern Sie die Daten im lokalen Store, während die App offline ist.
Aktualisieren des Synchronisierungsverhaltens der Client-App
Ändern Sie in diesem Abschnitt das Clientprojekt so, dass ein Offlineszenario mithilfe einer ungültigen Anwendungs-URL für Ihr Back-End simuliert wird. Alternativ können Sie Netzwerkverbindungen deaktivieren, indem Sie Ihr Gerät in den Flugzeugmodus verschieben. Wenn Sie Datenelemente hinzufügen oder ändern, werden diese Änderungen im lokalen Speicher gespeichert, aber nicht mit dem Back-End-Datenspeicher synchronisiert, bis die Verbindung erneut hergestellt wird.
Öffnen Sie im Projektmappen-Explorer die Constants.cs Projektdatei aus dem portablen Projekt, und ändern Sie den Wert, um
ApplicationURLauf eine ungültige URL zu verweisen:public static string ApplicationURL = @"https://your-service.azurewebsites.net/";Öffnen Sie die Datei TodoItemManager.cs aus dem Portable-Projekt und fügen Sie dem try...catch-Block in SyncAsync ein catch für die Basisklasse Exception hinzu. Dieser Catch-Block schreibt die Ausnahmemeldung wie folgt in die Konsole:
catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }Erstellen sie die Client-App, und führen Sie sie aus. Fügen Sie einige neue Elemente hinzu. Beachten Sie, dass für jeden Versuch, mit dem Back-End zu synchronisieren, eine Ausnahme in der Konsole protokolliert wird. Diese neuen Elemente sind nur im lokalen Speicher vorhanden, bis sie an das mobile Back-End übertragen werden können. Die Client-App verhält sich so, als ob sie mit dem Back-End verbunden ist und alle Erstellungs-, Lese-, Aktualisierungs-, Lösch- (CRUD)-Vorgänge unterstützt.
Schließen Sie die App, und starten Sie sie neu, um zu überprüfen, ob die von Ihnen erstellten neuen Elemente im lokalen Store beibehalten werden.
(Optional) Verwenden Sie Visual Studio, um Ihre Azure SQL-Datenbanktabelle anzuzeigen, um zu sehen, dass sich die Daten in der Back-End-Datenbank nicht geändert haben.
Öffnen Sie in Visual Studio den Server-Explorer. Navigieren Sie zu Ihrer Datenbank in Azure–>SQL-Datenbanken. Klicken Sie mit der rechten Maustaste auf Ihre Datenbank, und wählen Sie Im SQL Server-Objekt-Explorer öffnenaus. Jetzt können Sie zu Ihrer SQL-Datenbanktabelle und ihrem Inhalt navigieren.
Aktualisieren der Client-App zum erneuten Verbinden Ihres mobilen Back-Ends
Verbinden Sie die App in diesem Abschnitt erneut mit dem mobilen Back-End, das simuliert, dass die App wieder in einen Onlinezustand zurückkehrt. Wenn Sie die Aktualisierungsgeste ausführen, werden Daten mit Ihrem mobilen Back-End synchronisiert.
Öffnen Sie Constants.cs erneut. Korrigieren Sie den
applicationURLPunkt auf die richtige URL.Erstellen Sie die Client-App neu, und führen Sie sie aus. Die App versucht, nach dem Start mit dem back-End der mobilen App zu synchronisieren. Stellen Sie sicher, dass in der Debugkonsole keine Ausnahmen protokolliert werden.
(Optional) Zeigen Sie die aktualisierten Daten entweder mithilfe des SQL Server-Objekt-Explorers oder eines REST-Tools wie Fiddler oder Postman an. Beachten Sie, dass die Daten zwischen der Back-End-Datenbank und dem lokalen Speicher synchronisiert wurden.
Beachten Sie, dass die Daten zwischen der Datenbank und dem lokalen Speicher synchronisiert wurden und die Elemente enthalten, die Sie hinzugefügt haben, während Ihre App getrennt war.