c# - 更新 SQLite 数据库并在同一个异步函数中使用更新的记录

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

我正在使用此方法更新特定表的元组

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 记录绑定(bind)到绑定(bind)到 View 的 ViewModel。
private async void button_Tapped(object sender, TappedRoutedEventArgs e)
{
    MyTableRepository.Update(scheduleRecord);

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

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

我是异步等待的新手。所以我的感觉是,也许 ViewModel 甚至在之前就已经更新了
MyTableRepository.Update(scheduleRecord);

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

最佳答案

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

你需要做的是改变Update来自 async voidasync 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();
}

作为旁注:
  • 如果你没有做任何事,那就在 UpdateAsync 里面等待。 ,您可以简单地返回正在执行的 Taskawait它在调用链上更高:
    public Task UpdateAsync(MyTable entity)
    {
       SQLiteAsyncConnection conn = new SQLiteAsyncConnection(path);
       return conn.UpdateAsync(entity); 
    }
    
  • 确保您正确处理数据库连接。
  • 关于c# - 更新 SQLite 数据库并在同一个异步函数中使用更新的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27775482/

    相关文章:

    C# 从 MemoryStream 打开 Office 文档和 Xps 文件

    c# - 设置全局化 Nuget 包

    C# : public observablecollection<ViewModel> instance pass items to protected observablecollection<ViewModel>

    c++ - C++ 的 SQLite 替代方案

    c# - 如何获取上传进度?

    c# - Entity Framework 模型缓存使其无法用于大量数据库模式

    SQLite 自然连接坏了?

    r - 有没有办法使用R或SQLite管理多个大型sqlite文件?

    wpf - Metro 风格 (WinRT) UI 是否适合企业应用程序?

    windows-runtime - WinRT 中的 MAX_PATH