【问题标题】:Update SQLite db & use updated records in same async fuction更新 SQLite 数据库并在同一个异步函数中使用更新的记录
【发布时间】:2015-01-05 16:44:05
【问题描述】:

我正在使用这种方法来更新特定表的元组

public async void Update(MyTable entity)
{
    SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
    await conn.UpdateAsync(entity); 
}

参考:http://msdn.microsoft.com/en-us/library/windows/apps/dn263243.aspx

现在主要是,我正在尝试更新 MyTable 中的记录并将 MyTable 记录绑定到绑定到视图的 ViewModel。

private async void button_Tapped(object sender, TappedRoutedEventArgs e)
{
    MyTableRepository.Update(scheduleRecord);

    this.DefaultViewModel["MyViewModel"] =await ViewModelClass.GetMyTableDataAsync();
}

这里的问题是视图没有得到更新。在我停止应用程序并检查数据库值后,数据库似乎已更新,然后如果我再次运行应用程序,则会显示所需的更新视图。

我是异步等待的新手。所以我的感觉是 ViewModel 可能在更新之前就更新了

MyTableRepository.Update(scheduleRecord);

被执行。 我其实不知道确切的原因。请帮忙。

【问题讨论】:

  • 我只是想分享那个模块(09) Local data 为任何发现这篇文章并想了解更多信息的开发人员详细讨论 SQLite。 blog.jerrynixon.com/2014/10/…
  • 感谢@JerryNixon-MSFT。提供的链接上有很多东西要学习。顺便说一句,我很抱歉。错误在于我如何更新 MyViewModel。实际上我应该从 MyViewModel 中删除 scheduleRecord ,然后我应该调用 this.DefaultViewModel["MyViewModel"] =await ViewModelClass.GetMyTableDataAsync();简而言之,我的逻辑错了。无论如何一百万thanx 4你的帮助

标签: c# sqlite windows-runtime winrt-xaml async-await


【解决方案1】:

您的Update 方法以“一劳永逸”的方式运行。当您await GetMyTableDataAsync() 时,您的数据库中的数据可能尚未更新。

您需要做的是将Updateasync void 更改为async Task

public async Task UpdateAsync(MyTable entity)

await 就可以了:

await UpdateAsync(entity);

您的完整代码如下所示:

private async void button_Tapped(object sender, TappedRoutedEventArgs e)
{
    await MyTableRepository.UpdateAsync(scheduleRecord);

    this.DefaultViewModel["MyViewModel"] = await ViewModelClass.GetMyTableDataAsync();
}

附注:

  1. 如果您除了在 UpdateAsync 中等待之外没有做任何事情,您可以简单地将正在执行的 Taskawait 返回到调用链的更高位置:

    public Task UpdateAsync(MyTable entity)
    {
       SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
       return conn.UpdateAsync(entity); 
    }
    
  2. 确保正确处理数据库连接。

【讨论】:

  • 我将 UpdateAsync 更改为异步任务。仍然是同样的问题...我认为您的第二点是正确的,即数据库连接未正确处理...目前正在弄清楚...
  • 除非 SQLiteAsyncConnection.UpdateAsync 将同步伪装成异步,否则在您的代码中无法保证数据在读取之前会被保存。
  • @PauloMorgado 请解释一下。如果他使用await UpdateAsync,为什么不能保证阅读前更新?
  • 您的问题原始代码,而不是您的答案代码。 OP 似乎怀疑你在这里指出了一个真正的问题。
  • 非常抱歉。错误在于我如何更新 MyViewModel。实际上我应该从 MyViewModel 中删除 scheduleRecord ,然后我应该调用 this.DefaultViewModel["MyViewModel"] =await ViewModelClass.GetMyTableDataAsync();简而言之,我的逻辑错了。无论如何一百万thanx 4你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多