Datasynkronisering offline

Datasynkronisering offline är en SDK-funktion i Azure Mobile Apps. Data lagras i ett lokalt lager. När appen är offline kan du fortfarande skapa, ändra och söka efter data. Data synkroniseras med din Azure Mobile Apps-tjänst när enheten är online. SDK stöder konfliktlösning när samma post ändras på både klienten och tjänsten.

Offlinesynkronisering har flera fördelar:

  • Förbättrar appens svarstider
  • Förbättrar appens tillförlitlighet när det finns en felaktig nätverksanslutning
  • Begränsar nätverksanvändningen i nätverk med hög svarstid eller nätverk med datamätning
  • Stöder frånkopplad användning

Följande självstudier visar hur du lägger till offlinesynkronisering till dina mobila klienter med hjälp av Azure Mobile Apps:

Vad är en synkroniseringstabell?

Azure Mobile Apps SDK:er tillhandahåller IRemoteTable<T>, som kommer åt tjänsten direkt. Åtgärden misslyckas om enheten inte har någon nätverksanslutning. En synkroniseringstabell (tillhandahålls av IOfflineTable<T>) tillhandahåller samma åtgärder mot ett lokalt arkiv. Det lokala arkivet kan sedan synkroniseras med tjänsten vid ett senare tillfälle. Innan du utför några åtgärder måste du initiera det lokala arkivet.

Vad är en lokal butik?

Ett lokalt lager är skiktet för datapersistence på klientenheten. De flesta plattformar använder SQLite för det lokala arkivet, men iOS använder Core Data. Du kan också implementera din egen lokala butik. Använd till exempel en version av SQLite med SQLCipher för att skapa ett krypterat arkiv.

Hur fungerar offlinesynkronisering?

Klientkoden styr när lokala ändringar synkroniseras med en datasynkroniseringstjänst. Ingenting skickas till tjänsten förrän du skickar lokala ändringar. På samma sätt fylls det lokala arkivet med nya eller uppdaterade data endast när du hämtar data.

Du kan skicka väntande åtgärder för alla tabeller, en lista med tabeller eller en tabell:

// 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();

Synkronisering

Push-åtgärden skickar alla väntande ändringar i driftkön till tjänsten. Den väntande ändringen skickas till tjänsten via ett HTTP REST-anrop, som i sin tur ändrar databasen.

Push-åtgärder utförs innan några pull-åtgärder utförs. Pull-åtgärden hämtar ändrade data från tjänsten och lagrar dem i det lokala arkivet.

Implicit push-överföring

Om du kör en pull-överföring mot en tabell som har väntande lokala uppdateringar kör pull först en push-överföring för tabellen. Den här push-överföringen hjälper till att minimera konflikter mellan ändringar som redan finns i kö och nya data från servern. Du kan också konfigurera en push-överföring av alla tabeller genom att ange PushOtherTables i PullOptions:

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

Hämta en delmängd av poster

Du kan också ange en fråga som används för att avgöra vilka poster som ska ingå i offlinedatabasen. Till exempel:

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

Inkrementell synkronisering

Azure Mobile Apps implementerar inkrementell synkronisering. Endast poster som har ändrats sedan den senaste pull-åtgärden hämtas. Inkrementell synkronisering sparar tid och bandbredd när du bearbetar stora tabeller.

För varje unik fråga UpdatedAt lagras fältet för den senast överförda posten som en token i offlinearkivet. Det sista UpdatedAt värdet lagras i deltatokenarkivet. Delta-token-arkivet implementeras som en tabell i offlinearkivet.

Prestanda och konsekvens

Synkroniseringen stoppas ibland i förtid. Till exempel:

  • Det nätverk som du använder för synkronisering blir otillgängligt under synkroniseringsprocessen.
  • Du tvingar programmet att stängas under synkroniseringen.

För att minimera risken för konsekvensproblem i offlinedatabasen skrivs varje post till databasen när den tas emot. Du kan också välja att skriva posterna till databasen i batchar. Batchåtgärder ökar prestandan för offlinedatabasskrivningar under pull-åtgärden. Men de ökar också risken för inkonsekvens mellan tabellmetadata och data i tabellen.

Du kan justera intervallet mellan skrivningar på följande sätt:

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

Den här koden samlar in skrivningar i batchar med 25 poster. Prestandatestning tyder på att prestanda förbättrar upp till ett värde på 25. Ett WriteDeltaTokenInterval värde som är större än 25 förbättrar inte prestanda avsevärt.

Rensning

Du kan rensa innehållet i det lokala arkivet med hjälp IOfflineTable<T>.PurgeItemsAsyncav . Rensning kan vara nödvändigt om du har inaktuella data i klientdatabasen eller om du vill ignorera alla väntande ändringar. En rensning rensar en tabell från det lokala arkivet. Så här rensar du en tabell:

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

Metoden PurgeItemsAsync() genererar ett InvalidOperationException fel om det finns väntande ändringar i tabellen. I det här fallet kan du tvinga rensningen att ske:

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

Rensning är en sista utväg för att rensa en tabell i offlinebutiken, eftersom den rensar alla poster från cacheminnet och kräver att du laddar ned dem igen.