以编程方式导入Room数据库

时间:2018-06-18 15:31:02

标签: android sqlite android-sqlite android-room

对于导出会议室数据库作为备份文件我正在调用方法RoomDatabase.close(),因为当您关闭数据库时,它会将所有数据库文件.db-wal.db-shm合并为一个MyApp.db文件我使用此代码将MyApp.db文件导出到外部存储:

 try {
                    val dbFile = File(databasePath)
                    val fileInputStream = FileInputStream(dbFile)
                    val buffer = ByteArray(1024)

                    while (true) {
                        val length = fileInputStream.read(buffer)
                        if (length <= 0)
                            break
                        outputStream?.write(buffer, 0, length)
                    }
                } catch (e: IOException) {
                    Log.e(TAG, "EXCEPTION WHILE WRITING DATABASE TO BACKUP", e)
                }

这个代码的和平执行正确并导出数据库,然后我使用下面的代码导入数据库它需要导出MyApp.db文件并替换当前使用的数据库,但在应用程序中它显示空数据库,即使我重新打开应用程序,我猜它是因为当我导入数据库时​​,它只导入了这个db文件MyApp.db,但缺少.db-wal.db-shm如何从.db中提取这些文件?而且我做得对吗?

try {
            val parcelFileDescription = contents.parcelFileDescriptor
            val fileInputStream = FileInputStream(parcelFileDescription.fileDescriptor)

            val output = FileOutputStream(dbPath)

            val buffer = ByteArray(1024)

            while (true) {
                val length = fileInputStream.read(buffer)
                if (length <= 0)
                    break
                output.write(buffer, 0, length)
            }

            output.flush()
            output.close()
            fileInputStream.close()
            Toast.makeText(context, "Import completed", Toast.LENGTH_SHORT).show()


        } catch (e: Exception) {
            Log.e("TAGAS", "EXCEPTION: ", e)
        }

1 个答案:

答案 0 :(得分:0)

代码的一个问题是它在输出文件get中的相同位置重复覆盖。将0替换为索引var:

output.write(buffer, 0, length)