在 Xamarin azure 中,UpdateAsync 不更新数据库,只在本地更改信息
In Xamarin azure, UpdateAsync is not updating database, only changes info locally
因此,当我在 table 上调用 UpdateSync
时,我的应用程序会在本地更新内部信息,但它不会更新在线数据库?我做错了什么吗?
IMobileServiceSyncTable<Models.About_user> about_user_table;
Update_my_table(Object Item)
{
Models.About_user About_user = (Models.About_user)Item;
await about_user_table.UpdateAsync(About_user);
IMobileServiceSyncTable<Models.About_user> about_user_table;
}
根据您的代码,您正在使用同步 table (IMobileServiceSyncTable
),对于 UpdateAsync
操作,它将更新您的本地 SQLite 数据库。为了更新您的在线数据库,您需要使用以下代码执行推送操作:
await Client.SyncContext.PushAsync();
注意:执行推送操作时,可能需要处理冲突解决。更多细节,你可以参考adrian关于Handling Conflict Resolution and An Offline Client.
的书
此外,您可以使用 client.GetTable<Model>()
构建在线 table 并针对您的在线 table 进行 CUD 更改。详情请参考here. Additionally, you could follow here离线同步
所以我所要做的就是把它放在我的 updatesync 的底部。注意:这没有用,除非我在我的 about_user 模型中明确有一个名为版本的变量,如 [JsonProperty(PropertyName = "Version")]
public 字符串版本 { 得到;放; }
await about_user_table.UpdateAsync(About_user);
try
{
await Client.SyncContext.PushAsync();
/// await about_user_table.PullAsync("all About_user", about_user_table.CreateQuery());
}
catch (MobileServicePushFailedException ex)
{
if (ex.PushResult != null)
{
foreach (var error in ex.PushResult.Errors)
{
await ResolveConflictAsync(error,"about_user_table");
}
}
}
async Task ResolveConflictAsync(MobileServiceTableOperationError error, string table_name)
{
var serverItem = error.Result.ToObject<About_user>();
var localItem = error.Item.ToObject<About_user>();
// Note that you need to implement the public override Equals(TodoItem item)
// method in the Model for this to work
if (serverItem.Equals(localItem))
{
// Items are the same, so ignore the conflict
await error.CancelAndDiscardItemAsync();
return;
}
// Client Always Wins
localItem.Version = serverItem.Version;
await error.UpdateOperationAsync(JObject.FromObject(localItem));
}
因此,当我在 table 上调用 UpdateSync
时,我的应用程序会在本地更新内部信息,但它不会更新在线数据库?我做错了什么吗?
IMobileServiceSyncTable<Models.About_user> about_user_table;
Update_my_table(Object Item)
{
Models.About_user About_user = (Models.About_user)Item;
await about_user_table.UpdateAsync(About_user);
IMobileServiceSyncTable<Models.About_user> about_user_table;
}
根据您的代码,您正在使用同步 table (IMobileServiceSyncTable
),对于 UpdateAsync
操作,它将更新您的本地 SQLite 数据库。为了更新您的在线数据库,您需要使用以下代码执行推送操作:
await Client.SyncContext.PushAsync();
注意:执行推送操作时,可能需要处理冲突解决。更多细节,你可以参考adrian关于Handling Conflict Resolution and An Offline Client.
的书此外,您可以使用 client.GetTable<Model>()
构建在线 table 并针对您的在线 table 进行 CUD 更改。详情请参考here. Additionally, you could follow here离线同步
所以我所要做的就是把它放在我的 updatesync 的底部。注意:这没有用,除非我在我的 about_user 模型中明确有一个名为版本的变量,如 [JsonProperty(PropertyName = "Version")] public 字符串版本 { 得到;放; }
await about_user_table.UpdateAsync(About_user);
try
{
await Client.SyncContext.PushAsync();
/// await about_user_table.PullAsync("all About_user", about_user_table.CreateQuery());
}
catch (MobileServicePushFailedException ex)
{
if (ex.PushResult != null)
{
foreach (var error in ex.PushResult.Errors)
{
await ResolveConflictAsync(error,"about_user_table");
}
}
}
async Task ResolveConflictAsync(MobileServiceTableOperationError error, string table_name)
{
var serverItem = error.Result.ToObject<About_user>();
var localItem = error.Item.ToObject<About_user>();
// Note that you need to implement the public override Equals(TodoItem item)
// method in the Model for this to work
if (serverItem.Equals(localItem))
{
// Items are the same, so ignore the conflict
await error.CancelAndDiscardItemAsync();
return;
}
// Client Always Wins
localItem.Version = serverItem.Version;
await error.UpdateOperationAsync(JObject.FromObject(localItem));
}