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方法逻辑是:
- 检查对象的主键字段(这里是
CompanyId)是否有值 - 根据主键值在数据库中查找对应的记录
- 找到后才会更新该记录的其他字段
你之前的代码没有设置CompanyId,所以方法找不到要更新的行,返回的checker其实是0,只是你没处理这个分支而已。
额外小建议
- 避免直接用
Convert.ToDecimal,改用decimal.TryParse可以优雅处理用户输入非数字的情况,防止程序崩溃 - 如果之后需要动态更新不同ID的记录,可以在导航到Form2时把目标ID传递过去(比如通过构造函数或绑定的视图模型参数)
内容的提问来源于stack exchange,提问作者Sreedevi Vijayan
相关产品推荐
相关产品推荐

