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

.NET MAUI中SQLite异常:找不到matches表问题求助

解决SQLite-Net-PCL中“no such table: matches”错误

以下是针对该问题的排查与修复方案:

1. 修复异步初始化的竞态问题

你的页面构造函数是同步方法,但直接调用了内部包含异步逻辑的CreateMatch和Load_Matches,这会导致数据库初始化(表创建)还未完成就执行了数据操作,直接触发表不存在的错误。

修复步骤:

将数据操作逻辑移到异步生命周期方法中,确保异步操作执行完成后再进行下一步:

public MainPage()
{
    dbManager = new DBManager();
    InitializeComponent();
    selectedindex = 0;
}

protected override async void OnAppearing()
{
    base.OnAppearing();
    await CreateMatch(); // 等待异步创建完成
    await Load_Matches(); // 等待异步加载完成
}

同时要保证CreateMatch和Load_Matches是异步方法并正确使用await:

private async Task CreateMatch()
{
    // 你的Match对象创建逻辑
    await dbManager.AddMatch(yourMatchInstance);
}

private async Task Load_Matches()
{
    var matches = await dbManager.GetMatches();
    // 绑定数据到UI的逻辑
}

2. 补全Match实体类的语法

你提供的Match类代码缺少闭合的大括号,这会导致实体类无法正确编译,进而CreateTableAsync<Match>无法生成对应的表。补全类定义:

namespace Tichu_Counter
{
    [Table("matches")]
    public class Match
    {
        [PrimaryKey,AutoIncrement]
        [Column("Match_ID")]
        public int match_ID { get; set; }

        [Column("Name_A")]
        public String name_A { get; set; }

        [Column("Name_B")]
        public String name_B { get; set; }

        [Column("Score_A")]
        public int score_A { get; set; }

        [Column("Score_B")]
        public int score_B { get; set; }

        [Column("Rounds_A")]
        public String rounds_a { get; set; }

        [Column("Rounds_B")]
        public String rounds_b { get; set; }

        [Column("Selected")]
        public bool selected { get; set; }

        [Column("Date")]
        public string date { get; set; }
    } // 补上缺失的类闭合大括号
}

3. 验证数据库路径与表创建结果

添加调试日志,确认数据库文件路径及表创建是否成功:

static async Task Init()
{
    if (dbconnection != null)
        return;
    var dbPath = Path.Combine(FileSystem.AppDataDirectory, db_name);
    Debug.WriteLine($"数据库路径:{dbPath}"); // 输出路径到调试窗口
    dbconnection = new SQLiteAsyncConnection(dbPath);
    try
    {
        var createResult = await dbconnection.CreateTableAsync<Match>();
        Debug.WriteLine($"表创建结果:{createResult}"); // 查看创建状态
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"创建表失败:{ex.Message}"); // 捕获异常排查原因
    }
}

运行后,根据调试窗口的路径找到数据库文件,用SQLite浏览器(如SQLiteStudio)打开,直接检查matches表是否存在。

4. 确保依赖库版本兼容

确认安装的sqlite-net-pcl版本与项目框架(.NET MAUI/Xamarin等)兼容,同时安装配套的SQLitePCLRaw.bundle_green(SQLite-Net-PCL依赖的原生SQLite库),避免因缺少原生库导致表创建失败。


内容的提问来源于stack exchange,提问作者Nikolas G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:33:19