Я занимаюсь разработкой приложения для Android.При первой установке он загружает данные из Firebase (firestore) и сохраняет их в локальной базе данных.Но производительность очень плохая.Поэтому я решил создать файл БД и включить его в APK.Тогда приложению не нужно загружать данные из Firebase.
private fun provideDatabase(context: Context): MhwDatabase {
return instance ?: generateDatabase(context)
}
fun generateDatabase(context: Context): MhwDatabase {
copyAttachedDatabase(context, "mhw.db")
return Room.databaseBuilder(context.applicationContext, MhwDatabase::class.java, "mhw.db")
.addMigrations(MIGRATION_1_2)
.build().apply {
instance = this
}
}
fun copyAttachedDatabase(context: Context, databaseName: String) {
Log.d(TAG, "[MHW] copyAttachedDatabase start")
val dbPath = context.getDatabasePath(databaseName)
// If the database already exists, return
if (dbPath.exists()) {
Log.d(TAG, "[MHW] copyAttachedDatabase already exist")
return
}
// Make sure we have a path to the file
dbPath.parentFile.mkdirs()
// Try to copy database file
try {
val br = BufferedReader(InputStreamReader(context.assets.open("databases/$databaseName")))
val bw = BufferedWriter(FileWriter(dbPath))
Log.d(TAG, "[MHW] write db file: $dbPath")
var line: String? = null;
while ({ line = br.readLine(); line }() != null) {
bw.write(line)
}
bw.flush()
bw.close()
br.close()
} catch (e: IOException) {
Log.e(TAG, "[MHW] Failed to open file", e)
e.printStackTrace()
}
Log.d(TAG, "[MHW] copyAttachedDatabase done")
}
Этот код работает нормально.Нет ошибок / исключений.
Но когда я пытаюсь прочитать данные из локальной базы данных, происходит сбой с журналом ниже.
09-16 23:00:52.467 31922-32011/com.eastriver.mhwdb E/SQLiteLog: (11) database corruption at line 54610 of [2ef4f3a5b1]
09-16 23:00:52.468 31922-32011/com.eastriver.mhwdb E/SQLiteLog: (11) database corruption at line 54651 of [2ef4f3a5b1]
(11) statement aborts at 9: []
(11) database disk image is malformed
09-16 23:00:52.484 31922-32011/com.eastriver.mhwdb E/SQLiteLog: (11) database corruption at line 54610 of [2ef4f3a5b1]
(11) database corruption at line 54651 of [2ef4f3a5b1]
(11) statement aborts at 9: []
(11) database disk image is malformed
09-16 23:00:52.487 31922-32011/com.eastriver.mhwdb E/SQLiteDatabase: Failed to open database '/data/user/0/com.eastriver.mhwdb/databases/mhw.db'.
android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed (code 11): , while compiling: PRAGMA journal_mode
Чтобы получить файл БД, яиспользовал «Проводник устройства» в Android Studio.Сначала приложение загружает данные из базы данных и сохраняет их в локальной базе данных.После этого я скопировал файл БД и использовал его.
И использовал «Комната» в качестве локальной базы данных.
Плюс, когда я получил файл БД, я открылэто с помощью настольного приложения «БД-браузер для SQLite».И я подтвердил, что БД действительна.
Но после того, как копия БД завершена, я получаю файл БД с помощью «Device File Explorer» в Android Studio и пытаюсь прочитать файл БД с помощью «Браузер БД для SQLite».».Но это не удалось с ошибкой msg: «образ диска базы данных искажен».
Я думаю ... причина в «Комнате» ??