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

.NET 8 MAUI应用无法连接SQLite数据库的问题求助

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:28:11