Xamarin.forms Azure移动服务-使用联机解决脱机插入

Xamarin.forms Azure移动服务-使用联机解决脱机插入,xamarin.forms,azure-mobile-services,Xamarin.forms,Azure Mobile Services,我有一个脱机同步表,可以将项目插入其中。My Mobile Services Web Api控制器添加并返回的Id与使用IMobileServiceSyncTable.InsertAsyncitem预期行为插入本地SQLite数据库的Id不同 发到服务器上的帖子很好。该项由API创建。我的问题是在本地解决该项目。我正在使用PullAsync操作跟踪此操作。当我查看项目列表时,我创建的原始项目具有Id预期行为的guid,通过API创建的项目具有我的数据库Id。我需要将API返回的项目与本地项目合并

我有一个脱机同步表,可以将项目插入其中。My Mobile Services Web Api控制器添加并返回的Id与使用IMobileServiceSyncTable.InsertAsyncitem预期行为插入本地SQLite数据库的Id不同

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

我不确定将此移动到在线插入是否能解决我的问题。 我有另一个手术,这直接取决于手术的成功。后续操作失败得很惨,因为很明显,在我的API中找不到guid Id值,并且我得到了一个HTTP 500错误字符串

我想知道是否有一个解决这个问题的最佳实践,或者一些我不知道的东西可以很容易地解决这个问题。我假设这对于使用框架的人来说是很常见的?本地SQLite存储中的id很可能永远不会与API后面的实际数据库值匹配

我已经通读了以下内容以及更多关于这个主题的内容,我仍然不清楚如何解决这个问题

欢迎任何建议

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

为了检查这个问题,我选择Node.js作为我的后端语言,而不下载c服务器项目,然后将其部署到azure移动应用程序。根据您的描述,我在本地表中插入了一个新项,然后针对远程表推送所有挂起的本地操作,然后从远程表中拉取最新的项。以下是由以下人员捕获的代码片段和网络跟踪:

PushAsync的网络跟踪:

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

PullAsync的网络跟踪:


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

我不清楚您是如何发布到服务器的,您的意思是向联机表端点发送请求以添加新项还是向本地表插入新项,然后将本地项推送到远程表?您的Web Api控制器是什么?好的,如果您在未指定id的情况下针对远程表添加新项,则移动应用后端将为您生成guid id。或者您正在谈论将同一项添加到远程表中,然后插入到本地表中,然后从远程表中提取该项,然后您想合并这两个项?很抱歉,这会造成混淆,我是这个同步框架的新手。同步框架将所有排队操作推送到服务器,即将插入推送到api端点。guid id插入到本地表中,然后立即推送到服务器。当它从服务器返回时,我进行同步,确保从服务器获得任何更新。拉取后,本地表有两项。一个是本地插入的,另一个是用有效Id推送到API端点的。我想要的是这两个项的合并,这样guid项就消失了。@Brucehen感谢您提供了指向该书的链接。我不知道它的存在。提供了一些见解。我现在正在仔细阅读。移动到在线插入修复了它现在。我仍将为脱机插入找到解决方案。
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());