如何每次启动App时用Assets中.db文件预填充Room数据库?支持仅更新时执行吗?
解决方案:每次启动或仅更新时重新预填充Room数据库
一、每次App启动时重新预填充数据库
Room的createFromAsset默认仅在数据库首次创建时生效,要实现每次启动都替换为Assets中的数据库文件,需先删除已存在的数据库相关文件,再让Room重新构建。
具体实现(结合你的Koin注入代码):
single<CustomDatabase> { val context = androidContext() val dbName = "database" // 获取数据库文件路径 val dbPath = context.getDatabasePath(dbName) // 删除所有关联的数据库文件(含临时文件) listOf( dbPath, File(dbPath.parent, "$dbName-shm"), File(dbPath.parent, "$dbName-wal") ).forEach { file -> if (file.exists()) file.delete() } // 重新构建数据库 Room.databaseBuilder( context, CustomDatabase::class.java, dbName ) .fallbackToDestructiveMigration() .createFromAsset("data.db") .build() }
注意:该方案会清空用户本地所有数据库数据,仅适合需要完全同步Assets文件内容的场景。
二、仅在App更新时执行重新预填充
通过记录App版本号,仅当检测到版本更新时才触发数据库替换操作,步骤如下:
- 读取当前App版本号
- 对比SharedPreferences中存储的上一次版本号
- 若版本更新,删除旧数据库文件并更新记录的版本号
- 构建Room数据库
代码示例:
single<CustomDatabase> { val context = androidContext() val dbName = "database" val sharedPref = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE) // 获取当前版本号 val currentVersion = context.packageManager.getPackageInfo(context.packageName, 0).versionCode val lastRecordedVersion = sharedPref.getInt("last_app_version", 0) // 检测版本更新并处理数据库 if (currentVersion > lastRecordedVersion) { val dbPath = context.getDatabasePath(dbName) listOf( dbPath, File(dbPath.parent, "$dbName-shm"), File(dbPath.parent, "$dbName-wal") ).forEach { file -> if (file.exists()) file.delete() } // 更新版本记录 sharedPref.edit().putInt("last_app_version", currentVersion).apply() } // 构建数据库 Room.databaseBuilder( context, CustomDatabase::class.java, dbName ) .fallbackToDestructiveMigration() .createFromAsset("data.db") .build() }
若使用Android 11+的长整型版本号或基于versionName的对比逻辑,可自行调整版本判断代码。
内容的提问来源于stack exchange,提问作者NullPointerException
相关产品推荐
相关产品推荐

