You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms中SQLite更新COMPANY_MASTER指定ID字段失败的解决

解决SQLite-net中UpdateAsync无法更新指定记录的问题

我一眼就发现问题所在啦——你在Form2里创建COMPANY_MASTER对象的时候,没有设置主键CompanyId的值!SQLite-net的UpdateAsync方法是通过主键来定位要更新的记录的,你没给CompanyId赋值,它根本不知道要更新哪条数据,自然就不会生效啦。

修复步骤

核心就是给要更新的对象指定明确的主键值,因为你要更新的是CompanyId=1的记录,直接在对象里设置这个值就行:

修改后的Form2代码:

private async void OnSave(object sender, EventArgs e)
{
    try
    {
        // 先验证输入的现金值是否合法,避免转换异常
        if (!decimal.TryParse(EOCash.Text, out decimal openingCash) || 
            !decimal.TryParse(EACash.Text, out decimal availableCash))
        {
            await DisplayAlert("Error", "请输入有效的数字格式金额", "Ok");
            return;
        }

        var expense = new COMPANY_MASTER
        {
            CompanyId = 1, // 关键:必须指定主键,告诉SQLite要更新哪条记录
            Opening_Cash = openingCash,
            Available_Cash = availableCash
        };
        
        var checker = await _connection.UpdateAsync(expense);
        if (checker == 1)
        {
            await DisplayAlert("Message", "数据更新成功", "Ok");
            await Navigation.PopAsync();
        }
        else
        {
            // 新增提示:如果返回0说明没找到对应ID的记录
            await DisplayAlert("提示", "未找到ID为1的公司记录,无法更新", "Ok");
        }
    }
    catch
    {
        await DisplayAlert("Error", "数据更新出错,请稍后重试", "Ok");
    }
}

为什么之前的代码不生效?

SQLite-net的UpdateAsync方法逻辑是:

  1. 检查对象的主键字段(这里是CompanyId)是否有值
  2. 根据主键值在数据库中查找对应的记录
  3. 找到后才会更新该记录的其他字段

你之前的代码没有设置CompanyId,所以方法找不到要更新的行,返回的checker其实是0,只是你没处理这个分支而已。

额外小建议

  • 避免直接用Convert.ToDecimal,改用decimal.TryParse可以优雅处理用户输入非数字的情况,防止程序崩溃
  • 如果之后需要动态更新不同ID的记录,可以在导航到Form2时把目标ID传递过去(比如通过构造函数或绑定的视图模型参数)

内容的提问来源于stack exchange,提问作者Sreedevi Vijayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:24:02