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

Android虚拟机数据库访问及MAUI程序SQLite跨虚拟机连接配置

MAUI SQLite 连接问题及Android虚拟机数据库访问指南

一、Android虚拟机里怎么访问数据库

  • 如果你是在MAUI APP内部访问:不用额外操作,EF Core SQLite会自动把数据库放在Android虚拟机的APP沙盒里,只要路径配置正确就能直接访问。
  • 要是想从电脑上看虚拟机里的数据库文件:打开Android Studio的Device File Explorer,找到/data/data/[你的APP包名]/files/data.db,导出后用SQLite工具(比如SQLiteStudio)查看就行。

二、MAUI代码修正步骤(解决"Cannot open"异常)

你的代码里有几个关键问题,按下面改:

1. 修复数据库路径

直接写data.db会因为平台路径权限问题打不开,替换MauiProgram.cs里的连接字符串:

public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>()
        .ConfigureFonts(fonts =>
        {
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
        });

    // 用平台适配的路径
    string dbPath = Path.Combine(FileSystem.AppDataDirectory, "data.db");
    builder.Services.AddDbContext<MyDbContext>(options => 
        options.UseSqlite($"Data Source={dbPath}"));

#if DEBUG
    builder.Logging.AddDebug();
#endif

    return builder.Build();
}

FileSystem.AppDataDirectory会自动适配Android/iOS的沙盒路径,不会有权限问题。

2. 修正MyDbContext代码

你的代码里有语法乱码、缺失DbSet、无参构造函数的问题,改完如下:

public class MyDbContext:DbContext
{
    // 只留带参数的构造函数,依赖注入用这个
    public MyDbContext(DbContextOptions<MyDbContext> options)
        : base(options)
    {
        // 确保数据库创建,种子数据会自动写入
        Database.EnsureCreated();
    }

    // 必须加这三个DbSet,EF Core需要识别实体
    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }
    public DbSet<SelectedCourse> SelectedCourses { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 修复关联实体的乱码代码
        modelBuilder.Entity<SelectedCourse>().ToTable("SelectedCourse");
        modelBuilder.Entity<SelectedCourse>().HasKey(sc => new { sc.Neptun, sc.Id });

        modelBuilder.Entity<SelectedCourse>()
            .HasOne(sc => sc.Student)
            .WithMany(s => s.SelectedCourses)
            .HasForeignKey(sc => sc.Neptun);

        modelBuilder.Entity<SelectedCourse>().HasOne<Course>(sc => sc.Course)
            .WithMany(s => s.SelectedCourses)
            .HasForeignKey(sc => sc.Id);

        // Student实体配置
        modelBuilder.Entity<Student>().ToTable("Student");
        modelBuilder.Entity<Student>().HasKey(s => s.Neptun);
        modelBuilder.Entity<Student>().Property(s => s.Name).IsRequired(true);
        modelBuilder.Entity<Student>().Property(s => s.Password).IsRequired(true);
        modelBuilder.Entity<Student>().Property(s => s.Email).IsRequired(true);
        modelBuilder.Entity<Student>().Property(s => s.AdmissionTime).IsRequired(true);

        modelBuilder.Entity<Student>().HasData(new[]
        {
            new Student(){Neptun="ABC123",Name="Jhin",Password="Jhin123",Email="jhin123@gmail.com",AdmissionTime=new DateTime(2019,9,1)}
        });

        // Course实体配置,修复种子数据的语法错误
        modelBuilder.Entity<Course>().ToTable("Course");
        modelBuilder.Entity<Course>().HasKey(c => c.Id);
        modelBuilder.Entity<Course>().Property(c => c.Name).IsRequired(true);
        modelBuilder.Entity<Course>().Property(c => c.Credit).IsRequired(true);
        modelBuilder.Entity<Course>().Property(c => c.Room).IsRequired(true);
        modelBuilder.Entity<Course>().Property(c => c.Limiting).IsRequired(true);
        modelBuilder.Entity<Course>().Property(c => c.CourseTime).IsRequired(true);
        modelBuilder.Entity<Course>().Property(c => c.Proffesor).IsRequired(true);

        modelBuilder.Entity<Course>().HasData(new[]
        {
            new Course(){ Id="aaaVIAUAC09",Name="Software Development Laboratory 1",Credit=4,Room="QBF232",Limiting=40,CourseTime="K:14:15-18:00",Proffesor="aaa"},
            new Course(){ Id="aaaVIAUAC02",Name="Client Side Technologies",Credit=4,Room="QBF15",Limiting=40,CourseTime="H:14:15-16:00",Proffesor="aaa"}
        });
    }
}

重点:删除无参构造函数,添加DbSet,修复OnModelCreating里的乱码和种子数据的语法错误。

3. 启动时初始化数据库

在App.xaml.cs里注入DbContext并确保初始化:

public partial class App : Application
{
    public App(MyDbContext dbContext)
    {
        InitializeComponent();
        // 确保数据库创建完成
        dbContext.Database.EnsureCreated();
        MainPage = new MainPage();
    }
}

三、关于Android/iOS虚拟机共享数据库的说明

SQLite是本地数据库,两个虚拟机的数据库是各自独立的沙盒文件,没法直接连接同一个数据库。如果要跨设备共享数据,有两个方案:

  • 搭一个远程数据库服务(比如SQL Server、PostgreSQL),让两个虚拟机都连这个远程库;
  • 做云同步,把本地SQLite的数据同步到云端(比如Firebase、Azure App Service)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:52:33