2017-08-30 2 views
0

Ich versuche eine Offline-Datenbanksynchronisierung mit Azure Mobile Apps zu erreichen. Wenn ich die Remote-Version (mit MobileServiceClient.GetTable anstelle von MobileService.GetSyncTable) verwende, funktioniert alles erfolgreich. Ich kann jedoch nicht mit der lokalen SQLite-Datenbank arbeiten.Offline-Synchronisierung mit Azure Mobile Apps funktioniert nicht, Datenbank sieht leer aus

DatabaseContext Die Klasse wird als Singleton im Autofac-Container registriert.

public class DatabaseContext 
{ 
    private readonly MobileServiceClient _client; 
    private readonly MobileServiceSQLiteStore _store; 

    public DatabaseContext() 
    { 
     if (File.Exists(Constants.LocalDatabase)) 
     { 
      File.Delete(Constants.LocalDatabase); 
     } 

     _client = new MobileServiceClient(Constants.ApiEndpoint); 
     _store = new MobileServiceSQLiteStore(Constants.LocalDatabaseName); 
    } 

    public async Task Initialize() 
    { 
     _store.DefineTable<Activities>(); 

     await _client.SyncContext.InitializeAsync(_store); 
     await _client.SyncContext.PushAsync(); 

     var activitiesTable = _client.GetSyncTable<Activities>(); 
     await activitiesTable.PullAsync(null, activitiesTable.CreateQuery()); 


     // DATA IS EMPTY 
     var data = await activitiesTable.CreateQuery().ToListAsync(); 
    } 
} 

Meine Modellklasse:

public class Activities 
{ 
    public Guid Id { get; set; } 
    public string Name{ get; set; } 
    public DateTimeOffset? UpdatedAt { get; set; } 
    public DateTimeOffset? CreatedAt { get; set; } 
    public byte[] Version { get; set; } 
} 

Als ich an meinem Streaming-Protokolle innerhalb des azur Armaturenbrett schauen, kann ich diese Anfrage unter:

GET /tables/Activities $skip=0&$top=50&__includeDeleted=true&$skip=0&$top=50&__includeDeleted=true&X-ARR-LOG-ID=19cd669b-df9a-41ee-b86e-9db766fc8e01 443 - 70.52.250.32 ZUMO/4.0+(lang=Managed;+os=Android;+os_version=6.0.1;+arch=Unix;+version=4.0.0.0) - 200 0 0 3228 1241 2160 

es mit Postman Aufruf liefert Daten.

Irgendeine Idee?

Antwort

0

Das Problem kam von der API-Seite. Ich konnte Datensätze mithilfe von Postman abrufen, das ID-Feld war jedoch nicht in Kleinbuchstaben.

[Key] 
[TableColumn(TableColumnType.Id)] 
public string Id { get; set; } 

Sollte sein:

[Key] 
[TableColumn(TableColumnType.Id)] 
public string id { get; set; } 

Sehr frustrierend Fehler.

Angesichts dieses Lernprogramms: https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/server/, diese Klasse kann nicht ordnungsgemäß funktionieren, da "Id" Feld Camel Fall ist.

namespace Chapter3.DataObjects 
{ 
    public class Example : EntityData 
    { 
     public string StringField { get; set; } 
     public int IntField { get; set; } 
     public double DoubleField { get; set; } 
     public DateTimeOffset DateTimeField { get; set; } 
    } 
} 

EntityData Klasse wird über Remote-Tabellen arbeitet (MobileClientService.GetTable<T>), aber nicht mit Sync-Tabellen (MobileClientService.GetSyncTable<T>).

1

Obwohl Ihr Activities Modell arbeiten kann, würde ich mein Modell wie folgt definieren:

public class Activities 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    [UpdatedAt] 
    public DateTimeOffset? UpdatedAt { get; set; } 
    [CreatedAt] 
    public DateTimeOffset? CreatedAt { get; set; } 
    [Version] 
    public byte[] Version { get; set; } 
} 

Hinweis: Die createdAt und updatedAt und version Felder werden von der Datenbank aktualisiert, wenn Sie Datensatz drücken (e) Auf den Server werden sie aufgefüllt.

Ich testete auf meiner Seite und fand, dass ich die Aufzeichnungen vom Server ziehen konnte, und dort hat Aufzeichnungen in meinem sqlite db.

warten activitiesTable.PullAsync (null, activitiesTable.CreateQuery());

Der obige Code würde automatisch mehrere Anfragen (Standardseitengröße 50 für eine einzelne Anfrage) senden alle Datensätze zu ziehen, dann wäre es die folgende SQL-Anweisung ausführen Ihre lokalen Datenspeicher zu aktualisieren:

BEGIN TRANSACTION

INSERT oder IGNORE IN [TodoItem] ([ID]) WERTE (@ p0), (@ p1), (@ p2), (@ p3), (@ p4), (@ p5), (@ p6), (@ p7), (@ p8), (@ p9), (@ p10), (@ p11), (@ p12), (@ p13), (@ p14), (@ p15), (@ p16), (@ p17), (@ p18), (@ p19), (@ p20), (@ p21), (@ p22), (@ p23), (@ p24), (@ p25), (@ p26), (@ p27), (@ p28), (@ p29), (@ p30), (@ p31), (@ p32), (@ p33), (@ p34), (@ p35), (@ p36), (@ p37), (@ p38), (@ p39), (@ p40), (@ p41), (@ p42), (@ p43), (@ p44), (@ p45), (@ p46), (@ p47), (@ p48), (@ p49)

UPDATE [TodoItem] SET [Text] = @ p0, [Benutzer-ID] = @ p1 WHERE [id] = @ p2

UPDATE [TodoItem] SET [Text] = @ p0, [BenutzerId] = @ p1 WHERE [ID] = @ p2

.

.

TRANSACTION COMMIT

BEGIN TRANSACTION

INSERT OR IGNORE INTO [__CONFIG] ([id]) VALUES (@ p0)

UPDATE [__CONFIG] SET [Wert] = @ p0 wobei [ id] = @ p1

COMMIT TRANSACTION

Für weitere Informationen können Sie auf 012.307.937 verweisen.

Basierend auf Ihrer Beschreibung könnten Sie die Daten von Ihrem Server abrufen, aber Ihre lokale SQLite-Datenbank konnte nicht aktualisiert werden. Ich würde empfehlen, dass Sie fiddler nutzen könnten, um die Netzwerkspuren zu erfassen, wenn Sie PullAsync aufrufen und Ihre SQLite-Datenbank öffnen, um Ihre Tabelle zu überprüfen.

Zusätzlich wird, wie Using soft delete in Mobile Services erwähnt wie folgt:

Bei Verwendung Offline data Sync for Mobile Services Funktion der Client-SDK automatisch für gelöschte Datensätze abgefragt und entfernt sie aus der lokalen Datenbank. Ohne aktiviertes Löschen müssen Sie zusätzlichen Code im Back-End schreiben, damit das Client-SDK weiß, welche Datensätze aus dem lokalen Speicher entfernt werden müssen. Andernfalls sind der lokale Clientspeicher und das Back-End in Bezug auf diese gelöschten Datensätze inkonsistent, und die Clientmethode PurgeAsync() muss aufgerufen werden, um den lokalen Speicher zu löschen.

Hinweis: Sie müssen die deleted Eigenschaft aus den Aufzeichnungen überprüfen, wenn Ihr PullAsync aufrufen.

Darüber hinaus können Sie den "DEPLOYMENT> Quickstart" unter Ihrer mobilen App nutzen, um die Xamarin.Forms-Lösung herunterzuladen und auszuführen, um dieses Problem einzugrenzen. Weitere Details finden Sie unter here. Außerdem könntest du auf Adrian Halls Buch über Chapter 3 - Data Access and Offline Sync verweisen.

+0

Großartiger Inhalt, jedoch war mein Problem nicht verwandt. Danke für Ihre Hilfe! –

Verwandte Themen