Xamarin Forms SQLite查询动态列报错:找不到languagevaluecombine列
解决方案
问题出在计算属性不会被SQLite-net自动映射为数据库列,你用的JsonProperty是给JSON序列化用的,SQLite-net根本不认这个属性,所以数据库里压根没有languagevaluecombine这一列,自然查不到。
给你两种解决思路:
1. 直接在SQL查询中计算组合值
如果你的LanguageValueCombine是基于现有列(比如languagevalue1和languagevalue2)的组合,没必要在模型里搞计算属性,直接在SQL语句里拼接计算就行:
select DISTINCT (languagevalue1 || languagevalue2) as languagevaluecombine from MyWords
这里用||做字符串拼接(SQLite的语法),然后用as给结果起别名,和你原来的属性名对应,这样查询结果就能直接映射到你的模型属性上(如果需要的话)。
2. 将计算属性转为可持久化的列
如果你确实需要把这个组合值存在数据库里,得修改模型:
- 给属性加上SQLite-net的
[Column]特性,指定数据库列名 - 给属性加一个 backing field,因为SQLite-net需要可读写的属性(纯get的计算属性不会被映射)
- 确保在插入/更新数据时同步更新这个字段的值
示例代码:
public class MyWords { // 其他普通列,比如: public string LanguageValue2 { get; set; } public string LanguageValue1 { get; set; } private string _languageValueCombine; [Column("languagevaluecombine")] public string LanguageValueCombine { get => _languageValueCombine ?? $"{LanguageValue1}{LanguageValue2}"; set => _languageValueCombine = value; } // 或者在设置其他属性时自动更新: private string _languageValue1; public string LanguageValue1 { get => _languageValue1; set { _languageValue1 = value; _languageValueCombine = $"{_languageValue1}{LanguageValue2}"; } } }
改完模型后,记得更新数据库:要么删除旧的数据库文件让程序重新创建,要么手动写迁移脚本修改表结构添加languagevaluecombine列。
内容的提问来源于stack exchange,提问作者hugokis
相关产品推荐
相关产品推荐

