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

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_green NuGet包(推荐,包含全平台适配组件)
  • 或分别安装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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:27