Файл Android db скопирован, но открыть не удалось - PullRequest
0 голосов
/ 16 сентября 2018

Я занимаюсь разработкой приложения для 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: «образ диска базы данных искажен».

Я думаю ... причина в «Комнате» ??

1 Ответ

0 голосов
/ 16 сентября 2018

Вероятно, проблема существует, потому что вы пытаетесь прочитать файл базы данных в виде текста, в то время как это двоичный формат.Не используйте интерфейсы Reader / Writer, если вы не имеете дело с текстом, поскольку подразумеваемое кодирование текста может привести к тому, что он испортит данные.Просто используйте BufferedInputStream / BufferedOutputStream и напрямую скопируйте поток байтов в новый файл.

...