在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
相关产品推荐
相关产品推荐

