Xamarin共享项目SQLite查询失败:<string>部分报错求助
搞定Xamarin SQLite查询的小技巧
嘿,我来帮你解决这个SQLite查询的问题!既然你已经成功连接数据库、能获取表信息了,那离写出正确的查询只差一点点调整啦。你提到的<string>部分报错,大概率是泛型类型和查询结果不匹配导致的,下面我给你一步步拆解正确的写法:
第一步:先确认实体类和表结构对应
首先要保证你的C#实体类和数据库表的结构完全匹配,比如你有个User表,那实体类应该这么写:
public class User { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } }
这里的属性名、类型要和数据库表的列名、类型一一对应,不然查询时会出现类型映射错误。
第二步:正确编写SELECT查询(两种方式)
方式1:手动写SQL语句(适合复杂查询)
如果你坚持用原生SQL,要注意泛型类型必须和查询返回的结果类型一致:
- 查询整表数据:如果要返回整个
User对象列表,泛型用<User>:
// 假设你的数据库连接实例是_db(你已经通过依赖服务获取到的) var allUsers = _db.Query<User>("SELECT * FROM User");
- 查询单个string列:如果只查
Username列,泛型用<string>才是正确的,此时SQL语句只能返回这一列:
var usernames = _db.Query<string>("SELECT Username FROM User");
这里要注意:如果你的SQL语句返回多列(比如
SELECT Id, Username FROM User),却用了<string>,肯定会报错,因为SQLite无法把多列结果映射成单个string类型。
- 带条件的参数化查询:避免SQL注入,同时保证类型匹配:
// 查询邮箱是xxx@xxx.com的用户,泛型用<User> var targetUser = _db.Query<User>("SELECT * FROM User WHERE Email = ?", "xxx@xxx.com");
方式2:用LINQ查询(更安全,推荐!)
SQLite-net支持LINQ语法,这种方式是强类型的,几乎不会出现<string>这类类型不匹配的问题,写起来也更简洁:
// 查询所有用户 var allUsers = _db.Table<User>().ToList(); // 查询年龄大于18的用户(假设你加了Age属性) var adultUsers = _db.Table<User>().Where(u => u.Age > 18).ToList(); // 查询指定用户名的用户 var specificUser = _db.Table<User>().FirstOrDefault(u => u.Username == "guiwhatsthat");
排查你遇到的错误的关键点
- 泛型和返回结果不匹配:比如你用
Query<string>但SQL返回的是int类型的列(比如Id),或者多列数据,这时候肯定会报错; - 实体类和表结构不匹配:比如表中
Username列是TEXT类型,但你实体类里写成了int类型,映射时会出错; - SQL语句拼写错误:比如列名写错(把
Username写成UserName),导致返回的结果和预期类型不匹配。
按照上面的方法调整,应该就能解决你的问题啦!
内容的提问来源于stack exchange,提问作者guiwhatsthat
相关产品推荐
相关产品推荐

