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
相关产品推荐
相关产品推荐

