以编程方式导入 Room 数据库

Posted

技术标签:

【中文标题】以编程方式导入 Room 数据库【英文标题】:Importing a Room database programmatically 【发布时间】:2018-11-27 12:03:23 【问题描述】:

为了将房间数据库导出为备份文件,我正在调用方法 RoomDatabase.close(),因为当您关闭数据库时,它会将所有 db 文件 .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】:

您的代码的一个问题是它反复覆盖输出文件output.write(buffer, 0, length) 中的同一位置。将 0 替换为索引 var:

var index = 0
while (true) 
    val length = fileInputStream.read(buffer)
    if (length <= 0)
        break
    output.write(buffer, index, length)
    index += length

【讨论】:

以上是关于以编程方式导入 Room 数据库的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 CSV 数据导入 Access

android 开发进程 0.37 room数据存储的使用

在 C# 中以编程方式从 Excel 文件中大量导入数据到 Access

以编程方式运行 Magento 1.9.1.0 数据流导入配置文件

以编程方式在 Mac 上将 MS Access 导入 CSV

如何以编程方式从iOS中的Excel工作表导入数据[复制]