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

.NET MAUI Blazor创建SQLite数据库时遇初始化异常问题

解决Android平台SQLiteAsyncConnection初始化失败问题

问题核心原因

  1. NuGet包冲突:同时引用Microsoft.EntityFrameworkCore.Sqlite和sqlite-net-pcl,两者底层依赖的SQLitePCLRaw组件版本/实现不一致,导致Android无法加载正确的sqlite原生库。
  2. Android平台未显式初始化SQLite provider:Windows平台会自动处理SQLitePCLRaw的provider初始化,但Android需要手动触发。
  3. 异步初始化错误:构造函数中使用async void会导致数据库初始化未完成就可能被访问,引发异常。

分步解决方案

1. 清理冲突的NuGet包

移除Microsoft.EntityFrameworkCore.Sqlite包,同时精简SQLitePCLRaw相关引用(SQLitePCLRaw.bundle_green已包含所有必要组件,无需单独引用core、provider等包)。修改后的NuGet引用如下:

<ItemGroup>
  <PackageReference Include="Microsoft.Maui.Controls.Maps" Version="7.0.52" />
  <PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
  <PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
  <PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.3" />
</ItemGroup>

2. 在Android项目中添加SQLite初始化代码

打开Android项目的MainApplication.cs,在OnCreate方法中添加SQLitePCLRaw的初始化逻辑:

using Android.App;
using Android.Runtime;
using SQLitePCL;

namespace 你的应用命名空间;

[Application]
public class MainApplication : MauiApplication
{
    public MainApplication(IntPtr handle, JniHandleOwnership ownership)
        : base(handle, ownership)
    {
    }

    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

    public override void OnCreate()
    {
        base.OnCreate();
        // 初始化SQLitePCLRaw,自动设置正确的provider
        Batteries_V2.Init();
    }
}

3. 修复数据库异步初始化逻辑

将构造函数中的async void改为异步任务+延迟初始化,确保数据库连接完成后再被访问:

internal class DbContext : IDbContext
{
    private readonly Lazy<Task<SQLiteAsyncConnection>> _lazyDatabase;

    public DbContext()
    {
        _lazyDatabase = new Lazy<Task<SQLiteAsyncConnection>>(InitializeDatabase);
    }

    private async Task<SQLiteAsyncConnection> InitializeDatabase()
    {
        var dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "mydatabase.db3");
        var connection = new SQLiteAsyncConnection(dbPath);
        await connection.CreateTableAsync<Token>();
        return connection;
    }

    // 获取已初始化的数据库连接
    public async Task<SQLiteAsyncConnection> GetDatabaseAsync()
    {
        return await _lazyDatabase.Value;
    }
}

内容的提问来源于stack exchange,提问作者Hickori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:45:47