【问题标题】:Azure Mobile Services - Resolving offline Insert with onlineAzure 移动服务 - 解决离线插入与在线
【发布时间】:2018-04-14 07:37:51
【问题描述】:

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

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

我不确定将其移至在线插入是否能解决我的问题。 我有另一个操作立即取决于此操作的成功。后续操作惨遭失败,因为很明显,在我的 API 中找不到 guid Id 值,并且我收到一串 HTTP 500 错误。

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

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

欢迎任何建议。

【问题讨论】:

  • 我对您如何发布到服务器感到困惑,您的意思是向您的在线表端点发送请求以添加新项目或将新项目插入本地表,然后将您的本地项目推送到远程表?你的 Web Api 控制器是什么,https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/server/? AFAIK,如果您在未指定 id 的情况下针对远程表添加新项目,则移动应用后端将为您生成一个 guid id。
  • 或者你是说将相同的项目添加到远程表中,然后插入到本地表中,然后从远程表中拉出项目,然后要合并这两个项目?
  • 对不起,如果这令人困惑,我是这个同步框架的新手。同步框架将所有排队的操作推送到服务器,即将插入推送到 api 端点。 guid id 插入到本地表中,然后立即推送到服务器。当它从服务器返回时,我会进行同步(确保从服务器获得任何更新)。拉取后,本地表有两个项目。一个是本地插入的,另一个是使用“有效”ID 推送到 API 端点的。我想要的是这两个项目的合并,所以guid项目消失了。
  • @BruceChen 感谢您提供该书的链接。我不知道它的存在。 Chapter 3 - The Mobile Client 提供了一些见解。我现在正在阅读它。移动到在线插入现在修复它。我仍然会为离线插入找到解决方案。

标签: xamarin.forms azure-mobile-services


【解决方案1】:

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

为了检查这个问题,我选择 Node.js 作为我的后端语言,没有下载 c# 服务器项目,然后将其部署到 azure 移动应用程序。根据您的描述,我在本地表中插入了一个新项目,然后将所有待处理的本地操作推送到远程表,然后从远程表中提取最新项目。这是fiddler捕获的代码sn-p和网络跟踪:

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 的网络跟踪:

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

PullAsync 的网络跟踪:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多