如何解决Xamarin Forms SQLite在Android 11上的运行错误?
问题根因
- 路径参数错误:
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)在Android平台返回的是应用内部私有存储的files目录,属于文件夹路径,并非完整的数据库文件路径,你需要手动拼接数据库文件名到该路径末尾。 - Android 11权限校验收紧:低版本Android系统对传入路径为目录的场景做了容错处理,会自动尝试适配错误生成临时文件,但Android 11及以上版本会直接抛出空引用异常,就是你遇到的对象引用错误。
- 冗余权限不影响内部存储操作:你申请的外部存储相关权限和该问题无关,操作内部私有存储不需要任何外部存储权限,过度申请
MANAGE_EXTERNAL_STORAGE反而可能触发应用审核风险。
修复步骤
- 修正数据库路径拼接逻辑
替换你的路径获取代码为如下内容:
// 引用System.IO命名空间以使用Path.Combine方法 var rootDir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); // 拼接得到完整的数据库文件路径 var dbFullPath = Path.Combine(rootDir, "MyAppDB.sqlite"); var asyncConn = new SQLiteAsyncConnection(dbFullPath);
- 权限配置优化(可选)
如果你的应用不需要访问外部存储公共目录,可修改AndroidManifest.xml中的权限配置,移除冗余权限:
<!-- 仅当应用确实需要访问外部存储时保留对应权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 非文件管理器类应用无需申请该权限 --> <!-- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> -->
- 依赖版本适配
如果修正路径后问题仍存在,升级SQLite-net-pcl依赖包到最新稳定版,旧版本依赖对Android 11的API适配存在兼容问题,升级后即可解决。
内容的提问来源于stack exchange,提问作者Daniel Mamnev
相关产品推荐
相关产品推荐

