2017-08-30 2 views
0

J'essaie d'obtenir une synchronisation de base de données hors connexion à l'aide des applications mobiles Azure. Lorsque j'utilise la version distante (en utilisant MobileServiceClient.GetTable au lieu de MobileService.GetSyncTable) tout fonctionne correctement. Cependant, je ne peux pas le faire fonctionner avec la base de données SQLite locale.Synchronisation hors connexion avec les applications mobiles Azure ne fonctionnant pas, la base de données semble vide

DatabaseContext La classe est enregistrée en tant que singleton dans le conteneur Autofac.

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

Ma classe de modèle:

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; } 
} 

Quand je regarde mes journaux de diffusion en continu à l'intérieur du tableau de bord d'azur, je peux voir cette demande:

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 

Appeler avec Postman renvoie des données.

Une idée?

Répondre

0

Le problème venait du côté de l'API. J'ai été en mesure de récupérer des enregistrements en utilisant Postman, cependant, le champ id n'était pas en minuscules.

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

devrait être:

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

bug très frustrant. Compte tenu de ce tutoriel: https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/server/, cette classe ne peut pas fonctionner correctement à cause du champ "Id" étant chameau.

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; } 
    } 
} 

classe EntityData travaillera en utilisant des tables distantes (MobileClientService.GetTable<T>), mais pas avec des tables de synchronisation (MobileClientService.GetSyncTable<T>).

1

Bien que votre modèle Activities peut travailler, je définirais mon modèle comme suit:

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; } 
} 

Note: Le createdAt et updatedAt et version champs sont mis à jour par la base de données, si vous appuyez sur dossier (s) au serveur, ils seront peuplés.

J'ai testé sur mon côté et j'ai trouvé que je pouvais tirer les dossiers du serveur et il y a des enregistrements dans mon sqlite db.

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

Le code ci-dessus enverra automatiquement plusieurs requêtes (par défaut pagesize 50 pour une seule requête) pour tirer tous les enregistrements, il exécuterait l'instruction SQL suivante pour mettre à jour votre magasin de données locales:

BEGIN TRANSACTION

INSERT OU IGNORE DANS [TodoItem] ([id]) VALEURS (@ 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 [texte] = @ p0, [UserId] = @ p1 WHERE [id] = @ p2

MISE À JOUR [TodoItem] SET [Texte] = @ p0, [UserId] = @ p1 OERE [id] = @ p2

.

.

COMMIT TRANSACTION

= @ p0 BEGIN TRANSACTION

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

UPDATE [__CONFIG] SET [valeur] où [ id] = @ p1

COMMIT TRANSACTION

pour plus de détails, vous pouvez consulter à Debugging the Offline Cache. En fonction de votre description, vous pouvez récupérer les données de votre serveur, mais il n'a pas pu mettre à jour votre db sqlite local. Je recommanderais que vous puissiez utiliser fiddler pour capturer les traces du réseau lors de l'appel PullAsync et ouvrez votre db sqlite pour vérifier votre table.

De plus, comme mentionné Using soft delete in Mobile Services comme suit:

Lorsque vous utilisez la fonction Offline data Sync for Mobile Services, le SDK client interroge automatiquement les enregistrements supprimés et les supprime de la base de données locale. Si la suppression logicielle est activée, vous devez écrire du code supplémentaire sur le backend pour que le SDK client sache quels enregistrements doivent être supprimés du magasin local. Sinon, le magasin local et le serveur principal du client seront incohérents en ce qui concerne ces enregistrements supprimés et la méthode client PurgeAsync() doit être appelée pour effacer le magasin local.

Note: Vous devez vérifier la propriété deleted des dossiers lorsque votre appel PullAsync.

En outre, vous pouvez tirer parti du "DEPLOIEMENT> Quickstart" sous votre application mobile pour télécharger et exécuter la solution Xamarin.Forms pour affiner ce problème. Pour plus de détails, vous pouvez vous référer au here. En outre, vous pouvez vous référer au livre d'adrian hall sur Chapter 3 - Data Access and Offline Sync.

+0

Bon contenu, cependant, mon problème n'était pas lié. Merci de votre aide! –