Android db文件已复制但无法打开

时间:2018-09-16 14:19:59

标签: android kotlin android-sqlite android-room

我正在开发一个android应用。 首次安装时,它会从Firebase(firestore)下载数据并将其存储到本地数据库中。 但是性能太差了。 因此,我决定创建一个db文件,并将其包含到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

要获取db文件,我在Android Studio中使用了“设备文件资源管理器”。 首先,该应用程序从Firebase下载数据,并将其存储到本地数据库中。 之后,我复制了db文件,并使用了它。

然后我将“ Room”用作本地数据库。


另外,当我获得db文件时,我使用“ SQLite的数据库浏览器”桌面应用程序打开了该文件。 我确认数据库有效。

但是,在完成数据库复制之后,我在Android Studio中使用“设备文件资源管理器”获取了数据库文件,并尝试使用“用于SQLite的数据库浏览器”读取数据库文件。 但这失败,并显示错误消息:“数据库磁盘映像格式错误”。

我认为...是“房间”的原因吗?

1 个答案:

答案 0 :(得分:1)

该问题可能存在,因为您试图以二进制格式读取数据库文件作为文本。如果您不处理文本,请不要使用Reader / Writer接口,因为隐式文本编码可能会导致其弄乱数据。只需直接使用BufferedInputStream / BufferedOutputStream并将字节流直接复制到新文件即可。