Azure移动服务 - 使用在线解决脱机插入

时间:2017-11-01 21:41:30

标签: xamarin.forms azure-mobile-services

我有一个离线同步表,我插入一个项目。我的移动服务Web Api控制器使用IMobileServiceSyncTable<T>.InsertAsync(item)预期行为)添加并返回与插入本地SQLite数据库的ID不同的ID。

服务器的帖子很好。该项由API创建。我遇到的问题是本地项目的解决方案。我正在使用PullAsync()操作跟进此操作。当我查看我的项目列表时,我创建的原始项目带有ID(预期行为)的guid,并且通过API创建的项目与我的数据库ID一起出现。我需要将API返回项与本地项合并。

我不确定将此移动到在线插入是否可以解决我的问题。  我有另一个操作立即依赖于此操作成功。后续操作失败了,因为很明显,我的API中找不到guid Id值,而且我收到了一串HTTP 500错误。

我想知道是否有解决此问题的最佳做法,或者我不知道的那些可以轻松解决此问题的方法。我认为这对使用框架的人来说很常见吗?本地SQLite存储中的id很可能永远不会匹配API背后的实际数据库值。

我已经阅读了以下内容(以及有关该主题的更多内容),我仍然不清楚如何解决此问题。

欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

  

同步框架正在将所有排队操作推送到服务器,即将插入推送到api端点。 guid id插入本地表,然后立即推送到服务器。当它从服务器返回时,我进行同步(确保我从服务器获得任何更新)。拉后,本地表有两个项目。本地插入的那个,以及用“有效”Id推送到API端点的那个。

为了检查这个问题,我选择Node.js作为我的后端语言而不下载c#server项目,然后将其部署到azure移动应用程序。根据您的描述,我将一个新项目插入到我的本地表中,然后针对远程表推送所有挂起的本地操作,然后从远程表中提取最新项目。以下是fiddler

捕获的代码段和网络跟踪
var todoItem = new TodoItem { Text = TextInput.Text };
//insert a new item into local table
await todoTable.InsertAsync(todoItem);
//push all pending local operations against the remote table
await App.MobileService.SyncContext.PushAsync();  //offline sync
await todoTable.PullAsync("todoItems", todoTable.CreateQuery());

PushAsync的网络跟踪:

enter image description here

注意:由于您的本地项具有id属性的GUID值,因此在针对远程表的插入期间,如果{{{},则服务器不会生成新值1}}值存在然后将返回409冲突。

PullAsync的网络跟踪:

enter image description here

我建议您捕获网络跟踪以缩小此问题。并且您的推送操作似乎没有按预期工作,您需要检查推送操作的响应中的id值。如果您构建了c#后端,我假设您需要检查您的桌面模型,更多详细信息可以参考adrian hall的书here。此外,您可以参考.NET后端here的移动应用程序快速入门示例。