2017-08-30 38 views
0

我正尝试使用Azure移动应用程序实现脱机数据库同步。当我使用远程版本(使用MobileServiceClient.GetTable而不是MobileService.GetSyncTable)时,一切都可以成功。但是,我无法使它与本地SQLite数据库一起工作。与Azure移动应用脱机同步无法正常工作,数据库看起来为空

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

我的模型类:

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

当我看着蔚蓝的仪表盘在我的流日志,我可以看到这个请求:

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 

与邮差调用返回的数据。

有什么想法?

回答

0

问题来自API方面。我能够使用邮递员检索记录,但是,ID字段不是小写字母。

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

应该是:

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

非常令人沮丧的错误。

鉴于本教程:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/server/,由于“Id”字段为骆驼大小写,此类无法正常工作。

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类将工作使用远程表(MobileClientService.GetTable<T>),但与同步表(MobileClientService.GetSyncTable<T>)。

1

虽然你的Activities模型可以工作,我会这样定义我的模型:

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

注:createdAtupdatedAtversion字段由数据库更新,如果你把结果到服务器,它们将被填充。

我在我身边进行了测试,发现我可以从服务器上获取记录,并且在sqlite数据库中有记录。

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

上面的代码会自动发送多个请求(默认页面大小50单个请求)拉的所有记录,那么它会执行下面的SQL语句来更新您的本地数据存储:

BEGIN TRANSACTION

INSERT OR IGNORE INTO [TodoItem]([id])VALUES(@ 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 [文字] = @ P0,[用户Id] = @ P1 WHERE [ID] = @ P2

UPDATE [TodoItem] SET [Text] = @ p0,[UserId] = @ p1 WHERE [id] = @ p2

COMMIT TRANSACTION

BEGIN TRANSACTION

INSERT或忽略INTO [__config]([ID])VALUES(@ P0)

UPDATE [__config] SET [值] = @ P0 WHERE [ ID = @ P1

COMMIT TRANSACTION

有关详细信息,你可以参考Debugging the Offline Cache

根据您的描述,您可以从服务器检索数据,但无法更新您的本地sqlite数据库。我建议你在调用PullAsync时可以利用fiddler来捕获网络跟踪,并打开你的sqlite数据库来检查你的表。

此外,由于如前所述Using soft delete in Mobile Services如下:

当使用Offline data Sync for Mobile Services功能,客户端SDK会自动查询已删除的记录,并从本地数据库删除它们。如果未启用软删除,则需要在后端编写其他代码,以便客户端SDK知道要从本地存储中删除哪些记录。否则,客户端本地存储和后端将与这些已删除的记录不一致,并且必须调用客户端方法PurgeAsync()来清除本地存储。

注:您需要从记录检查deleted属性时,您的呼叫PullAsync

此外,您可以利用移动应用程序下的“DEPLOYMENT> Quickstart”下载并运行Xamarin.Forms解决方案来缩小此问题。有关更多详细信息,请参阅here。此外,你可以参考阿德里安大厅关于Chapter 3 - Data Access and Offline Sync的书。

+0

伟大的内容,但是,我的问题是没有关系。感谢您的帮助! –

相关问题