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

1 回复

更多关于uni-app sqlite-release.aar 包中引用的DeviceInfo.sBaseFsRootPath值不固定 导致数据库文件重新创建的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中使用 sqlite-release.aar 包时,如果 DeviceInfo.sBaseFsRootPath 的值不固定,可能会导致数据库文件路径不稳定,从而引发数据库文件被重新创建的问题。这个问题通常发生在 Android 平台上,因为 sBaseFsRootPath 是用于确定数据库文件存储路径的一个关键变量。

问题分析

  1. sBaseFsRootPath 的作用:

    • sBaseFsRootPath 是用于指定数据库文件存储的根路径。如果这个值发生变化,SQLite 数据库文件的路径也会随之变化,导致系统认为这是一个新的数据库文件,从而重新创建数据库。
  2. sBaseFsRootPath 不固定的原因:

    • 可能是由于某些环境变量或系统状态的变化导致 sBaseFsRootPath 的值在每次应用启动时不一致。
    • 也可能是由于 DeviceInfo 类的初始化逻辑存在问题,导致 sBaseFsRootPath 的值没有被正确初始化或缓存。

解决方案

  1. 固定数据库文件路径:

    • 你可以通过手动指定数据库文件的路径来避免依赖 sBaseFsRootPath。例如,将数据库文件存储在应用的内部存储或外部存储的固定路径下。
    String dbPath = context.getFilesDir().getAbsolutePath() + "/my_database.db";
    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, null);
    
  2. 检查 DeviceInfo 初始化逻辑:

    • 如果 sBaseFsRootPath 的值是由 DeviceInfo 类提供的,检查该类的初始化逻辑,确保 sBaseFsRootPath 的值在应用启动时是固定且一致的。
  3. 缓存 sBaseFsRootPath 的值:

    • 在应用启动时,获取 sBaseFsRootPath 的值并缓存起来,后续使用缓存的路径来访问数据库文件。
    private static String cachedBaseFsRootPath;
    
    public static String getBaseFsRootPath(Context context) {
        if (cachedBaseFsRootPath == null) {
            cachedBaseFsRootPath = DeviceInfo.sBaseFsRootPath;
        }
        return cachedBaseFsRootPath;
    }
    
  4. 使用 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();
    }
回到顶部