java - android - 无法从 Assets 文件夹复制数据库 : API < 24

标签 java android database sqlite kotlin

您好,有一个问题,我无法将数据库(称为 xyz)从 Assets 文件夹复制到 24 以下任何 api 上的/data/data/com.example.app1beta/databases/xyz 文件夹。运行相同的代码在 api 24 及以上版本上我没有任何问题。数据库文件 xyz.db 位于 assets/databases 文件夹中。我得到的错误如下:

引起:java.io.FileNotFoundException:/data/data/com.example.app1beta/databases/xyz:打开失败:ENOENT(没有这样的文件或目录)

任何帮助将不胜感激!谢谢!

    val DATABASE_NAME = "xyz"

    class SQL_LITE_DB(val context: Context): SQLiteOpenHelper(context, DATABASE_NAME,null,1) {

        private val preferences: SharedPreferences = context.getSharedPreferences(
            "${context.packageName}.database_versions",
            Context.MODE_PRIVATE
        )

        private fun installDatabaseFromAssets() {
            val inputStream = context.assets.open("$ASSETS_PATH/$DATABASE_NAME.db")
            try {
                val outputFile = File(context.getDatabasePath(DATABASE_NAME).path)
                val outputStream = FileOutputStream(outputFile)

                inputStream.copyTo(outputStream)
                inputStream.close()
                outputStream.flush()
                outputStream.close()
            } catch (exception: Throwable) {
                throw RuntimeException("The $DATABASE_NAME database couldn't be installed.", exception)
            }
        }

            companion object {
            const val ASSETS_PATH = "databases"
        }

最佳答案

问题可能是数据库目录不存在(对于新安装的应用程序来说不存在)。

因此,如果该目录不存在,则需要创建该目录。例如:-

private fun installDatabaseFromAssets() {
    val inputStream = context.assets.open("$ASSETS_PATH/$DATABASE_NAME.db")
    val dbFile = File(context.getDatabasePath(DATABASE_NAME).toString())
    if (!dbFile.exists()) {
        if (!dbFile.parentFile.exists()) {
            dbFile.parentFile.mkdirs()
        }
    }
    try {
        //val outputFile = File(context.getDatabasePath(DATABASE_NAME).path)
        val outputStream = FileOutputStream(dbFile)

        inputStream.copyTo(outputStream)
        inputStream.close()
        outputStream.flush()
        outputStream.close()
    } catch (exception: Throwable) {
        throw RuntimeException("The $DATABASE_NAME database couldn't be installed.", exception)
    }
}

关于java - android - 无法从 Assets 文件夹复制数据库 : API < 24,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59228433/

相关文章:

ios - 具有购物 list 功能的食谱应用程序的数据库设计(iOS CoreData)

java - ListView onItemSelected 监听器不工作

java - 为什么在尝试编写 catch 时必须有抛出异常的可能性是强制性的?

android - 在 sqlite 中创建索引列

android - 如何从 ubuntu 12.04 操作系统在真实设备中运行 Android 应用程序?

mysql - 表连接 Ruby on Rails

algorithm - 在 O(n) 时间内执行连接?

javascript - 在 Liferay 7.2 中实现自动保存网页内容为草稿

java - 第二次为 Java 创建 MVC 或 MVP 模型的失败尝试 - getChildren().add 出现意外错误

android - 在 android 上生成 1024 位哈希