uni-app sqlite-release.aar 包中引用的DeviceInfo.sBaseFsRootPath值不固定 导致数据库文件重新创建的问题
uni-app sqlite-release.aar 包中引用的DeviceInfo.sBaseFsRootPath值不固定 导致数据库文件重新创建的问题
| 项目信息 | 详情 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC操作系统版本 | window10 |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 3.6.4 |
| 手机系统 | Android |
| 手机系统版本 | Android 11 |
| 手机机型 | RK3568A |
| 页面类型 | vue |
| vue版本 | vue3 |
| 打包方式 | 离线 |
| 项目创建方式 | HBuilderX |
操作步骤:
开发板断电重启后可偶先
预期结果:
–
实际结果:
–
bug描述:
sqlite-release.aar 中openDatabase方法,引用了lib.5plus.base-release.aar 包中 io.dcloud.common.util 设置的DeviceInfo.sBaseFsRootPath 值,该值通常为android的外部存储目录,例如 (/storage/emulated/0/Android/data) ,但是在机器断电重启拉起应用时,该值偶尔会变成(/data/user/0/),导致应用会出现两个数据库文件,即(/data/user/0/${myPackageName}/apps/UNI20DD3CE/doc/dbName.db和/storage/emulated/0/Android/data/${myPackageName}/apps/UNI20DD3CE/doc/dbName.db)
更多关于uni-app sqlite-release.aar 包中引用的DeviceInfo.sBaseFsRootPath值不固定 导致数据库文件重新创建的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app sqlite-release.aar 包中引用的DeviceInfo.sBaseFsRootPath值不固定 导致数据库文件重新创建的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 uni-app 中使用 sqlite-release.aar 包时,如果 DeviceInfo.sBaseFsRootPath 的值不固定,可能会导致数据库文件路径不稳定,从而引发数据库文件被重新创建的问题。这个问题通常发生在 Android 平台上,因为 sBaseFsRootPath 是用于确定数据库文件存储路径的一个关键变量。
问题分析
-
sBaseFsRootPath的作用:sBaseFsRootPath是用于指定数据库文件存储的根路径。如果这个值发生变化,SQLite 数据库文件的路径也会随之变化,导致系统认为这是一个新的数据库文件,从而重新创建数据库。
-
sBaseFsRootPath不固定的原因:- 可能是由于某些环境变量或系统状态的变化导致
sBaseFsRootPath的值在每次应用启动时不一致。 - 也可能是由于
DeviceInfo类的初始化逻辑存在问题,导致sBaseFsRootPath的值没有被正确初始化或缓存。
- 可能是由于某些环境变量或系统状态的变化导致
解决方案
-
固定数据库文件路径:
- 你可以通过手动指定数据库文件的路径来避免依赖
sBaseFsRootPath。例如,将数据库文件存储在应用的内部存储或外部存储的固定路径下。
String dbPath = context.getFilesDir().getAbsolutePath() + "/my_database.db"; SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, null); - 你可以通过手动指定数据库文件的路径来避免依赖
-
检查
DeviceInfo初始化逻辑:- 如果
sBaseFsRootPath的值是由DeviceInfo类提供的,检查该类的初始化逻辑,确保sBaseFsRootPath的值在应用启动时是固定且一致的。
- 如果
-
缓存
sBaseFsRootPath的值:- 在应用启动时,获取
sBaseFsRootPath的值并缓存起来,后续使用缓存的路径来访问数据库文件。
private static String cachedBaseFsRootPath; public static String getBaseFsRootPath(Context context) { if (cachedBaseFsRootPath == null) { cachedBaseFsRootPath = DeviceInfo.sBaseFsRootPath; } return cachedBaseFsRootPath; } - 在应用启动时,获取
-
使用
SharedPreferences存储路径:- 如果
sBaseFsRootPath的值在第一次启动时是固定的,可以将它存储在SharedPreferences中,后续从SharedPreferences中读取。
SharedPreferences prefs = context.getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE); String baseFsRootPath = prefs.getString("baseFsRootPath", null); if (baseFsRootPath == null) { baseFsRootPath = DeviceInfo.sBaseFsRootPath; prefs.edit().putString("baseFsRootPath", baseFsRootPath).apply(); } - 如果

