.NET 8 MAUI应用无法连接SQLite数据库的问题求助
问题描述
将基于.NET 7开发的MAUI应用升级到.NET 8并更新所有NuGet包后,无法连接内部SQLite数据库,调用CreateTableAsync时崩溃。
环境
- Windows 11 + Visual Studio 2022
- API 30 Android模拟器
- .NET 8
代码示例
public const SQLite.SQLiteOpenFlags Flags = SQLite.SQLiteOpenFlags.ReadWrite | SQLite.SQLiteOpenFlags.Create | SQLite.SQLiteOpenFlags.SharedCache; string sPath = BCDataConstants.DatabasePath; // 值为 /data/user/0/it.gattoneroph.photoapp/files/CAPhoto.db // 来源为 => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "CAPhoto.db"); Database = new SQLiteAsyncConnection(sPath, Flags); // 无报错,但所有属性均提示“System.TypeInitializationException: The type initializer for 'SQLite.SQLiteConnection' threw an exception.” CreateTableResult s= Database.CreateTableAsync<Tab_TabellaDatabase>().Result; // 此处崩溃
已安装的NuGet包
- SQLitePCLRaw.Core 2.1.8
- SQLite 3.13.0
- SQLitePCLRaw.lib.e_sqlite3 2.1.8
- SQLitePCLRaw.bundle_e_sqlite3 2.1.8
- SQLitePCLRaw.bundle_green 2.1.8
- System.Data.SQLite.Core 1.0.118
- SQLitePCLRaw.provider.dynamic_cdecl 2.1.8
错误堆栈
11:07:55:509 [DOTNET] System.AggregateException: 发生一个或多个错误。(SQLite.SQLiteConnection的类型初始值设定项引发异常。)
11:07:55:509 [DOTNET] ---> System.TypeInitializationException: SQLite.SQLiteConnection的类型初始值设定项引发异常。
11:07:55:509 [DOTNET] ---> System.TypeLoadException: SQLitePCL.SQLite3Provider_e_sqlite3的VTable设置失败
11:07:55:509 [DOTNET] at SQLite.SQLiteConnection..cctor()
11:07:55:509 [DOTNET] --- 内部异常堆栈跟踪结束 ---
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionWithLock..ctor(SQLiteConnectionString connectionString)
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionPool.Entry..ctor(SQLiteConnectionString connectionString)
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionPool.GetConnectionAndTransactionLock(SQLiteConnectionString connectionString, Object& transactionLock)
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionPool.GetConnection(SQLiteConnectionString connectionString)
11:07:55:509 [DOTNET] at SQLite.SQLiteAsyncConnection.GetConnection()
11:07:55:509 [DOTNET] at SQLite.SQLiteAsyncConnection.<>c__DisplayClass33_01[[SQLite.CreateTableResult, SQLite-net, Version=1.9.172.0, Culture=neutral, PublicKeyToken=null]].<WriteAsync>b__0() 11:07:55:509 [DOTNET] at System.Threading.Tasks.Task1[[SQLite.CreateTableResult, SQLite-net, Version=1.9.172.0, Culture=neutral, PublicKeyToken=null]].InnerInvoke()
11:07:55:509 [DOTNET] at System.Threading.Tasks.Task.<>c.<.cctor>b__281_0(Object obj)
11:07:55:509 [DOTNET] at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
11:07:55:509 [DOTNET] --- 上一位置的堆栈跟踪结束 ---
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionWithLock..ctor(SQLiteConnectionString connectionString)
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionPool.Entry..ctor(SQLiteConnectionString connectionString)
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionPool.GetConnectionAndTransactionLock(SQLiteConnectionString connectionString, Object& transactionLock)
11:07:55:509 [DOTNET] at SQLite.SQLiteConnectionPool.GetConnection(SQLiteConnectionString connectionString)
11:07:55:509 [DOTNET] at SQLite.SQLiteAsyncConnection.GetConnection()
11:07:55:509 [DOTNET] at SQLite.SQLiteAsyncConnection.get_Tracer()
11:07:55:509 [DOTNET] --- 内部异常堆栈跟踪结束 ---
11:07:55:509 [DOTNET] at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
11:07:55:509 [DOTNET] at System.Threading.Tasks.Task1[[SQLite.CreateTableResult, SQLite-net, Version=1.9.172.0, Culture=neutral, PublicKeyToken=null]].GetResultCore(Boolean waitCompletionNotification) 11:07:55:509 [DOTNET] at System.Threading.Tasks.Task1[[SQLite.CreateTableResult, SQLite-net, Version=1.9.172.0, Culture=neutral, PublicKeyToken=null]].get_Result()
11:07:55:509 [DOTNET] at PhotoApp.Classes.Database.BCDataConnection..ctor() in C:\Progetti
解决方案
1. 清理冲突的NuGet包
当前安装的包存在严重依赖冲突:同时引用了SQLite-net、System.Data.SQLite.Core和多个SQLitePCLRaw bundle包,导致类型加载异常。执行以下操作:
- 卸载所有已安装的SQLite相关NuGet包:包括
SQLite、System.Data.SQLite.Core、所有SQLitePCLRaw.*包 - 仅安装MAUI推荐的组合:
- 安装
sqlite-net-pcl(最新稳定版) - 安装
SQLitePCLRaw.bundle_green(最新稳定版) - 无需手动安装其他SQLitePCLRaw子包,bundle包会自动处理依赖
- 安装
2. 修复数据库路径
在MAUI Android中,Environment.SpecialFolder.UserProfile并非推荐的存储路径,改用MAUI内置API获取正确路径:
// 替换原路径获取代码 string sPath = Path.Combine(FileSystem.AppDataDirectory, "CAPhoto.db");
3. 初始化SQLitePCLRaw提供器
在应用启动时(如MauiProgram.cs的CreateMauiApp方法)添加初始化代码,确保提供器正确加载:
using SQLitePCL; public static MauiApp CreateMauiApp() { // 初始化SQLitePCLRaw Batteries_V2.Init(); var builder = MauiApp.CreateBuilder(); // ... 其他配置代码 return builder.Build(); }
4. 避免同步阻塞异步方法
原代码使用.Result阻塞异步方法,易引发死锁或异常传播,改用await:
// 替换同步调用为异步 CreateTableResult s = await Database.CreateTableAsync<Tab_TabellaDatabase>();
确保包含此代码的方法标记为async。
5. 清理项目缓存
- 删除项目目录下的
bin和obj文件夹 - 在VS中执行「工具 → NuGet包管理器 → 管理解决方案的NuGet包 → 设置 → 清除所有NuGet缓存」
- 重新生成解决方案
内容的提问来源于stack exchange,提问作者Denis De Pauli

