.NET MAUI配置SQLite数据库绝对路径报错,求解决方案
.NET MAUI Android模拟器中SQLite数据库路径正确配置方案
直接使用Windows本地绝对路径给Android模拟器是错误的——Android模拟器拥有独立的沙箱文件系统,Windows的本地路径在模拟器环境中不存在,且应用没有权限访问这类外部路径,这就是你遇到SQLite.SQLiteException的原因。
以下是两种可行的解决方案:
方案一:保留原路径,通过ADB工具拉取/推送数据库文件
原代码的路径是模拟器应用沙箱内的合法路径,你可以通过ADB命令将数据库文件导出到本地,用DB Browser修改后再推回模拟器:
- 确认应用包名(可在MAUI项目的AndroidManifest.xml中查看
package属性) - 执行拉取命令:
adb pull /data/data/[你的应用包名]/files/SQLite.db3 C:\你想要保存的本地路径
- 用DB Browser修改完成后,推送回模拟器:
adb push C:\你保存的本地路径/SQLite.db3 /data/data/[你的应用包名]/files/
方案二:将数据库放在模拟器共享存储目录(如Download)
修改代码让数据库直接存放在模拟器的公共Download目录,这样你可以直接通过模拟器的文件管理器找到文件,也能通过模拟器的共享文件夹功能同步到本地:
修改Constants类代码
public static class Constants { private const string DBFileName = "SQLite.db3"; public const SQLiteOpenFlags Flags = SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache; public static string DatabasePath { get { #if ANDROID // 获取Android外部存储的Download目录 var downloadDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads); return Path.Combine(downloadDir.AbsolutePath, DBFileName); #else // 其他平台保留原路径逻辑 return Path.Combine(FileSystem.Current.AppDataDirectory, DBFileName); #endif } } }
配置Android权限
在Android项目的AndroidManifest.xml中添加存储权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="33" />
动态申请权限
Android 6.0及以上版本需要在运行时动态申请存储权限,你可以在应用启动时添加权限申请逻辑:
#if ANDROID var status = await Permissions.CheckStatusAsync<Permissions.StorageWrite>(); if (status != PermissionStatus.Granted) { status = await Permissions.RequestAsync<Permissions.StorageWrite>(); } #endif
两种方案对比:方案一无需修改应用逻辑,适合临时调试;方案二无需频繁使用ADB命令,日常查看更便捷,但需要处理权限配置。
内容的提问来源于stack exchange,提问作者newbie6381741
相关产品推荐
相关产品推荐

