You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:08:35