Xamarin Android C#通过SQLite查邮箱记录返回空值问题求助
排查Xamarin Android中SQLite按邮箱查询返回空的问题
嘿,我来帮你一步步排查这个问题,咱们从几个关键方向入手:
1. 先确认核心数据与参数是否正确
- 先检查
MainActivity.Email的实际值:调用查询前,先打印这个字段的内容,看看是不是你预期的邮箱(有没有空格、大小写错误或者空字符串?):Console.WriteLine($"当前查询邮箱:{MainActivity.Email}"); - 验证数据库中是否存在匹配记录:用SQLite可视化工具(比如SQLiteStudio)打开你的数据库文件,手动执行类似
SELECT * FROM User WHERE Email LIKE '%你的邮箱%'的语句,确认有没有符合条件的记录。注意SQLite默认是区分大小写的,如果数据库里是test@example.com,你传Test@Example.com就会查不到。
2. 修复Single()带来的潜在问题
你的代码里用了Single(),这个方法的要求是:查询结果必须恰好有一条匹配记录,如果没有匹配或者有多条匹配,都会直接抛出异常,而不是返回null。你说的“返回空值”很可能是异常被静默处理了,或者你混淆了异常场景和空值场景。
建议改成SingleOrDefault(),没找到匹配时会返回null,这样能更清晰地判断结果:
public User ReturnRecordUsingEmail(string email) { var db = new SQLiteConnection(dbpath); // 用SingleOrDefault替代Single,无匹配时返回null var record = db.Table<User>().Where(r => r.Email.Contains(email)).SingleOrDefault(); return record; }
调用时一定要先判空,避免空引用崩溃:
var targetUser = db.ReturnRecordUsingEmail(MainActivity.Email); if (targetUser != null) { Toast.MakeText(this, targetUser.LastName.ToString(), ToastLength.Long).Show(); } else { Toast.MakeText(this, "未找到匹配的用户记录", ToastLength.Long).Show(); }
3. 检查数据库路径与映射是否正确
- 确认
dbpath的正确性:打印dbpath的完整路径,然后去对应的位置找到数据库文件,用工具打开验证数据是否存在。如果路径错了,你查的就是一个空数据库,自然返回null。 - 检查
User类的ORM映射:确保Email属性和数据库中的列名一致,比如如果数据库列是email(小写),而你的类属性是Email(大写),需要添加[Column("email")]注解来明确映射:public class User { [PrimaryKey, AutoIncrement] public int Id { get; set; } [Column("Email")] // 确保和数据库列名一致 public string Email { get; set; } public string LastName { get; set; } // 其他属性... }
4. 调试生成的SQL语句
把SQLite生成的查询语句打印出来,直接在数据库工具中执行,看是否能得到结果:
public User ReturnRecordUsingEmail(string email) { var db = new SQLiteConnection(dbpath); var query = db.Table<User>().Where(r => r.Email.Contains(email)); // 打印生成的SQL语句 Console.WriteLine($"生成的SQL:{query.ToString()}"); var record = query.SingleOrDefault(); return record; }
把输出的SQL复制到SQLite工具中执行,就能明确是查询逻辑的问题,还是数据/参数的问题。
内容的提问来源于stack exchange,提问作者Code Bank
相关产品推荐
相关产品推荐

