A Xamarin.Forms-mobilalkalmazás offline szinkronizálásának engedélyezése
Áttekintés
Ez az oktatóanyag bemutatja az Azure Mobile Apps for Xamarin.Forms offline szinkronizálási funkcióját. Az offline szinkronizálás lehetővé teszi a végfelhasználók számára az adatok megtekintését, hozzáadását és módosítását a mobilalkalmazásokkal– még akkor is, ha nincs hálózati kapcsolat. A módosításokat a rendszer egy helyi adatbázisban tárolja. Miután az eszköz ismét online állapotba áll, a rendszer szinkronizálja ezeket a módosításokat a távoli szolgáltatással.
Ez az oktatóanyag a Xamarin.Forms gyorsindítási megoldásán alapul, Mobile Apps a [Xamarin iOS-alkalmazás létrehozása] oktatóanyag befejezésekor fog létrehozni. A Xamarin.Forms gyorsindítási megoldása tartalmazza az offline szinkronizálást támogató kódot, amelyet csak engedélyezni kell. Ebben az oktatóanyagban frissíti a gyorsindítási megoldást, hogy bekapcsolja az Azure Mobile Apps. Az alkalmazás offline-specifikus kódját is kiemeljük. Ha nem használja a letöltött gyorsindítási megoldást, hozzá kell adni az adatelérési bővítménycsomagokat a projekthez. További információ a kiszolgálóbővítmény-csomagokról: Az Azure-hoz készült .NET háttérkiszolgálói SDK Mobile Apps.
Az offline szinkronizálási funkcióval kapcsolatos további információkért tekintse meg az Offline adatszinkronizálás az Azure Mobile Apps.
Offline szinkronizálási funkció engedélyezése a gyorsindítási megoldásban
Az offline szinkronizálási kód A C# előprocesszori irányelvekkel szerepel a projektben. A OFFLINE_SYNC_ENABLED szimbólum meghatározásakor ezek a kódútvonalak szerepelnek a buildben. A Windows SQLite platformot is telepítenie kell.
A Visual Studio kattintson a jobb gombbal a Manage NuGet Packages for Solution... (NuGet-csomagok> kezelése a megoldáshoz... ) megoldásra, majd keresse meg és telepítse a Megoldás összes projektje számára elérhető Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-csomagot.
A Megoldáskezelő nyissa meg a TodoItemManager.cs fájlt a projektből a Portable (Hordozható) névvel, amely Portable Class Library project (Hordozható osztálytár projekt) névvel, majd a következő előprocesszori irányelvtől való eltekeréstől:
#define OFFLINE_SYNC_ENABLED
(Nem kötelező) A Windows támogatásához telepítse az alábbi SQLite-runtime-csomagok egyikét:
Windows 8.1 Runtime: Telepítse az SQLite-t a Windows 8.1-hez.
Windows Phone-telefon 8.1: A8.1-es Windows Phone-telefon SQLite telepítése.
Univerzális Windows-platformSQLite telepítése az Univerzális Windows számára.
Bár a rövid útmutató nem tartalmaz Universal Windows-projektet, a Xamarin Forms támogatja Windows Universal Windows platformot.
(Nem kötelező) Az alkalmazásprojektek Windows kattintson a jobb gombbal a ReferencesAdd>Reference...> (Hivatkozások referenciák Windows) elemre. Engedélyezze a megfelelő SQLite-t az Windows SDK-hoz, valamint a Visual C++ 2013 Runtime for Windows SDK-t. Az SQLite SDK-nevek kis mértékben eltérőek lehetnek az egyes Windows platform esetében.
Az ügyfél-szinkronizálási kód áttekintése
Itt röviden áttekintheti, hogy mi szerepel már az irányelvekben található oktatóanyag kódban #if OFFLINE_SYNC_ENABLED
. Az offline szinkronizálási funkció a Portable Class Library projekt TodoItemManager.cs projektfájljában található. A funkció fogalmi áttekintését lásd: Offline adatszinkronizálás az Azure Mobile Apps.
A táblaműveletek végrehajtásához inicializálni kell a helyi tárolót. A helyi tároló adatbázisa a TodoItemManager osztály konstruktorában van inicializálva az alábbi kóddal:
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>();
Ez a kód létrehoz egy új helyi SQLite-adatbázist a MobileServiceSQLiteStore osztály használatával.
A DefineTable metódus létrehoz egy táblát a helyi tárolóban, amely megfelel a megadott típus mezőinek. A típusnak nem kell tartalmaznia a távoli adatbázisban lévő összes oszlopot. Az oszlopok egy részkészlete tárolható.
A TodoItemManager todoTable mezője IMobileServiceSyncTable típusú az IMobileServiceTable helyett. Ez az osztály a helyi adatbázist használja az összes létrehozási, olvasási, frissítési és törlési (CRUD) táblaművelethez. Az IMobileServiceSyncContext metódus PushAsync metódusának hívásával eldöntheti, hogy a rendszer mikor továbbküldi ezeket a módosításokat a Mobile App háttéralkalmazásába. A szinkronizálási környezet segít megőrizni a táblakapcsolatokat azáltal, hogy az ügyfélalkalmazás által a PushAsync hívatáskor módosított összes táblában követi és lekért módosításokat.
A Mobile App háttéralkalmazással való szinkronizáláshoz a következő SyncAsync metódust hívjuk meg:
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"]); } } }
Ez a minta egyszerű hibakezelést használ az alapértelmezett szinkronizáláskezelővel. Egy valós alkalmazás egy egyéni IMobileServiceSyncHandler implementációval kezeli a különböző hibákat, például a hálózati feltételeket és a kiszolgálóütközéseket.
Offline szinkronizálással kapcsolatos szempontok
A mintában a SyncAsync metódust csak indításkor és szinkronizálás kérése esetén hívjuk meg. Egy Android- vagy iOS-alkalmazásban a szinkronizálás kezdeményezéséhez húzza le az elemlistát; A Windows kattintson a Szinkronizálás gombra. Egy valós alkalmazásban a szinkronizálás akkor is elindítható, ha a hálózati állapot megváltozik.
Ha olyan táblán hajt végre leküldést, amely a környezet által nyomon követni függőben lévő helyi frissítéseket tartalmazza, a leküldéses művelet automatikusan elindít egy korábbi környezetbeli leküldést. A mintában található elemek frissítéseke, hozzáadása és befejezésekor kihagyhatja az explicit PushAsync hívást .
A megadott kódban a távoli TodoItem tábla összes rekordja lekérdezhető, de a rekordok szűrhetők is egy lekérdezésazonosító és a PushAsync lekérdezés átadásával. További információ: Növekményes szinkronizálás offline módban adatszinkronizálás Azure Mobile Apps.
Az ügyfélalkalmazás futtatása
Most, hogy engedélyezve van az offline szinkronizálás, futtassa legalább egyszer az ügyfélalkalmazást minden platformon a helyi tároló adatbázisának feltöltéséhez. Később szimulálhat offline forgatókönyvet, és módosíthatja a helyi áruházban tárolt adatokat, amíg az alkalmazás offline állapotban van.
Az ügyfélalkalmazás szinkronizálási viselkedésének frissítése
Ebben a szakaszban módosítsa az ügyfélprojektet úgy, hogy offline forgatókönyvet szimulál, érvénytelen alkalmazás-URL-címet használva a háttéralkalmazáshoz. Másik lehetőségként kikapcsolhatja a hálózati kapcsolatokat az eszköz "Repülőgép üzemmódba" való áthelyezésével. Adatelemek hozzáadásakor vagy módosításakor ezek a módosítások a helyi tárolóban tárolódnak, de nem szinkronizálódnak a háttéradattárba a kapcsolat újra létrejötte előtt.
A Megoldáskezelő nyissa meg a Constants.cs projektfájlt a Portable
ApplicationURL
projektből, és módosítsa a értékét úgy, hogy érvénytelen URL-címre mutasson:public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
Nyissa meg a TodoItemManager.cs fájlt a Portable projektből, majd adjon hozzá egy catchet az alap Exception osztályhoz a try... catch blokk a SyncAsyncben. Ez a catch blokk a következőképpen írja a kivételüzenetet a konzolra:
catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }
Az ügyfélalkalmazás összeállítása és futtatása. Adjon hozzá néhány új elemet. Figyelje meg, hogy a rendszer kivételt naplóz a konzolon a háttéralkalmazással való szinkronizálás minden egyes kísérletekor. Ezek az új elemek csak a helyi tárolóban léteznek, amíg le nem lehet őketküldeni a mobil háttérnek. Az ügyfélalkalmazás úgy viselkedik, mintha a háttérhez csatlakozik, és támogat minden létrehozási, olvasási, frissítési, törlési (CRUD) műveletet.
Zárja be az alkalmazást, és indítsa újra annak ellenőrzéséhez, hogy a létrehozott új elemek megmaradnak-e a helyi áruházban.
(Nem kötelező) A Visual Studio használatával megtekintheti a Azure SQL Database táblát, és láthatja, hogy a háttéradatbázis adatai nem változtak.
A Visual Studio nyissa meg a Kiszolgálókezelőt. Lépjen az adatbázisra az Azure-SQL>adatbázisokban. Kattintson a jobb gombbal az adatbázisra, és válassza a Megnyitás a SQL Server Object Explorer. Most már tallózhat a SQL adatbázistáblához és annak tartalmához.
Az ügyfélalkalmazás frissítése a mobil háttéralkalmazás újracsatlakozáshoz
Ebben a szakaszban csatlakoztassa újra az alkalmazást a mobil háttéralkalmazáshoz, amely azt szimulálja, hogy az alkalmazás visszatér online állapotba. A frissítési kézmozdulat végrehajtásakor a rendszer szinkronizálja az adatokat a mobil háttéralkalmazással.
Nyissa meg újra a Constants.cs-t. Javítsa ki a
applicationURL
et, hogy a megfelelő URL-címre mutasson.Építse újra és futtassa az ügyfélalkalmazást. Az alkalmazás indítás után megpróbál szinkronizálni a mobilalkalmazás háttéralkalmazásával. Ellenőrizze, hogy a hibakeresési konzol nem naplózza-e a kivételeket.
(Nem kötelező) Tekintse meg a frissített adatokat egy SQL Server Object Explorer rest eszköz, például a Fiddler vagy a Postman használatával. Figyelje meg, hogy az adatok szinkronizálva vannak a háttéradatbázis és a helyi tároló között.
Figyelje meg, hogy az adatok szinkronizálva vannak az adatbázis és a helyi tároló között, és az alkalmazás leválasztása közben hozzáadott elemeket is tartalmazza.