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

在Xamarin Forms中使用SQLite-net-pcl创建数据库遇异常求助

问题排查与修复方案

先明确你代码里的几个核心问题,这些是导致数据库打开失败和后续错误的原因:

  • 构造函数名称错误:类名是MySQLDatabase,但你写的构造函数是MyDatabase(),这会导致初始化逻辑不会自动执行,db变量始终为null。
  • 数据库文件名拼写错误:路径里写的是mydatbase.db3(少了一个字母a),和报错里的mydatabase.db3不一致,导致找不到正确的文件路径。
  • 未定义变量conn:你定义的异步连接是db,但InsertData和CloseConnection方法里用的是conn,这会直接抛出未定义变量的异常;而且SQLiteAsyncConnection没有Close方法,异步连接不需要手动关闭。
  • 异步方法未等待:db.CreateTableAsync<MyTable>()是异步方法,你没有用await等待完成,可能表还没创建就执行插入操作,引发异常。

另外,SQLite-net-pcl 1.8.116版本确实没有SQLiteConnection.CreateFile()方法,因为当你通过连接执行数据库操作(比如创建表)时,数据库文件会自动创建,不需要手动调用创建文件的方法。

修正后的代码示例

using SQLite;
using System.IO;
using System.Threading.Tasks;

public class MySQLDatabase
{
    private static SQLiteAsyncConnection db;

    // 修正构造函数名称,和类名一致
    public MySQLDatabase()
    {
        if (db != null)
        {
            return;
        }

        // 修正文件名拼写错误
        string databasepath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "mydatabase.db3");
        db = new SQLiteAsyncConnection(databasepath);
        // 异步方法需要等待,这里用FireAndForget处理初始化
        _ = InitializeDatabaseAsync();
    }

    // 单独的初始化方法,处理异步操作
    private async Task InitializeDatabaseAsync()
    {
        await db.CreateTableAsync<MyTable>();
    }

    // 修正插入方法,使用db变量,并改为异步方法
    public async Task InsertData(int gameid, string preorder, string rating, string standards, string overpriced, string agerating, string gameplay, string recommend, string impact)
    {
        MyTable myNewTable = new MyTable
        {
            GameId = gameid,
            PreOrder = preorder,
            Rating = rating,
            Standards = standards,
            OverPriced = overpriced,
            AgeRating = agerating,
            Gameplay = gameplay,
            Recommend = recommend,
            Impact = impact
        };
        await db.InsertAsync(myNewTable);
    }

    // 移除错误的CloseConnection方法,SQLiteAsyncConnection不需要手动关闭
}

// 确保MyTable类有正确的SQLite属性标记,示例:
public class MyTable
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int GameId { get; set; }
    public string PreOrder { get; set; }
    public string Rating { get; set; }
    public string Standards { get; set; }
    public string OverPriced { get; set; }
    public string AgeRating { get; set; }
    public string Gameplay { get; set; }
    public string Recommend { get; set; }
    public string Impact { get; set; }
}

额外注意事项

  • 如果你偏好同步操作,可以改用SQLiteConnection,此时可手动管理连接,但同样不需要调用CreateFile(),执行CreateTable时会自动创建文件。
  • 确保Environment.SpecialFolder.MyDocuments路径对你的应用有读写权限,不同平台(iOS/Android/UWP等)的文档目录权限规则略有差异,但该目录通常默认允许读写。

内容的提问来源于stack exchange,提问作者sunboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:35:11