Xamarin新手学习SQLite插入功能遇未处理异常求助
解决Xamarin中SQLite插入时的未处理异常
嘿,作为刚接触Xamarin的开发者,碰到SQLite的异常确实挺头疼的,我来帮你捋捋新手常踩的几个坑,一步步排查问题:
1. 先把异常信息抓到手再说
现在你只知道是未处理异常,但具体是主键冲突?路径权限?还是Model类有问题?先给代码套个try-catch把详情打出来:
private void SaveButton_Clicked(object sender, EventArgs e) { try { // 你的插入逻辑代码 var travel = new Travel { /* 给属性赋值 */ }; var db = GetConnection(); db.Insert(travel); } catch (Exception ex) { Console.WriteLine($"错误详情:{ex.Message}"); Console.WriteLine($"堆栈信息:{ex.StackTrace}"); // 也可以弹窗显示给你自己看 DisplayAlert("出错啦", ex.Message, "我知道了"); } }
拿到具体错误信息,才能精准定位问题!
2. 检查数据库连接的正确性
新手很容易在连接实例上出问题:
- 建议用单例模式管理
SQLiteConnection,避免重复创建或意外关闭连接:private static SQLiteConnection _dbConnection; private SQLiteConnection GetConnection() { if (_dbConnection == null) { // 标准的本地应用数据路径写法,别自己瞎拼路径 string dbPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TravelRecord.db3"); _dbConnection = new SQLiteConnection(dbPath); // 确保你的Model表已经创建 _dbConnection.CreateTable<Travel>(); } return _dbConnection; } - 别在每次操作后随便调用
Close(),SQLiteConnection是轻量级的,保持单例更稳妥。
3. 你的Model类配置对了吗?
SQLite对Model类的特性标记有要求,少一个都可能报错:
[Table("TravelRecords")] // 可选,但最好明确表名 public class Travel { // 必须要有主键,AutoIncrement可选但建议加 [PrimaryKey, AutoIncrement] public int Id { get; set; } // 字符串类型可以加长度限制,避免溢出 [MaxLength(100)] public string Destination { get; set; } // DateTime类型如果是可空的,需要加格式标记 [DateTimeFormat("yyyy-MM-dd HH:mm:ss")] public DateTime? TravelDate { get; set; } }
重点:必须标记主键,否则插入时会直接抛出异常!
4. 别在UI线程硬怼数据库操作
Xamarin的UI线程不能长时间阻塞,同步执行数据库操作可能触发异常,建议用异步方式:
private async void SaveButton_Clicked(object sender, EventArgs e) { await Task.Run(() => { var travel = new Travel { Destination = "测试目的地" }; var db = GetConnection(); db.Insert(travel); }); await DisplayAlert("搞定", "数据插入成功", "好的"); }
如果追求更规范的写法,建议直接用SQLite-net的异步版本SQLiteAsyncConnection。
5. 再确认一遍数据库路径
你觉得路径没问题,但还是打印出来验证下:
string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TravelRecord.db3"); Console.WriteLine($"当前数据库路径:{dbPath}");
在输出窗口里复制这个路径,去设备的文件系统里确认文件是否存在、有没有读写权限(安卓需要注意文件权限,iOS一般默认没问题)。
内容的提问来源于stack exchange,提问作者khoi
相关产品推荐
相关产品推荐

