MAUI安卓端用sqlite-net-pcl遇SQLiteConnection初始化异常求助
解决MAUI中sqlite-net-pcl在Android 12上的加载异常问题
核心原因
异常提示无法加载SQLitePCLRaw.provider.dynamic_cdecl,说明Android平台缺少SQLite原生库的适配包。sqlite-net-pcl依赖SQLitePCLRaw实现跨平台SQLite操作,而Android需要特定的原生提供程序才能正常运行。
排查与解决方法
1. 安装完整的SQLitePCLRaw依赖包
sqlite-net-pcl默认可能未包含Android所需的原生提供程序,需手动安装适配包:
- 安装
SQLitePCLRaw.bundle_greenNuGet包(推荐,包含全平台适配组件) - 或分别安装
SQLitePCLRaw.core、SQLitePCLRaw.provider.sqlite3.android两个包
2. 调整Android链接器设置
链接器可能会剥离SQLite相关的原生库,需配置保留必要组件:
- 打开Android项目属性 → 链接器 → 将链接行为设置为仅SDK程序集
- 若仍有问题,添加
linker.xml文件到Android项目根目录,内容如下:
<linker> <assembly fullname="SQLitePCLRaw.core" /> <assembly fullname="SQLitePCLRaw.provider.sqlite3.android" /> <assembly fullname="SQLite-net" /> </linker>
3. 修正数据库路径(针对Android)
Environment.SpecialFolder.MyDocuments在Android上的路径可能存在权限或适配问题,改用MAUI官方推荐的应用私有存储路径:
var databasePath = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
确保已引用Microsoft.Maui.Storage命名空间。
4. 检查Android项目配置
- 确认目标框架为Android 12(API 31)或更高版本
- 若使用外部存储路径,需在
AndroidManifest.xml中添加读写权限(本地私有存储无需额外权限)
5. 修复代码中的异常处理漏洞
当前Init方法中,若创建SQLiteAsyncConnection失败,db会保持null,后续调用CreateTableAsync会引发新异常。需调整异常处理逻辑:
static async Task Init() { if(db != null) return; var databasePath = Path.Combine(FileSystem.AppDataDirectory, "MyData.db"); try { db = new SQLiteAsyncConnection(databasePath); await db.CreateTableAsync<BookPage>(); } catch (Exception ex) { Console.WriteLine($"数据库初始化失败: {ex.Message}\n{ex.InnerException?.Message}"); throw; // 若需上层处理异常可抛出,否则需添加null安全处理逻辑 } }
6. 彻底清理并重新构建项目
- 删除项目的
bin和obj文件夹 - 清除NuGet缓存:执行命令
dotnet nuget locals all --clear - 重新还原NuGet包并构建项目
内容的提问来源于stack exchange,提问作者Bence Hérincs
相关产品推荐
相关产品推荐

