【问题标题】:android - Cannot copy database from assets folder : API < 24android - 无法从资产文件夹复制数据库:API < 24
【发布时间】:2019-12-07 17:15:59
【问题描述】:

您好有一个问题,我无法将我的数据库(称为 xyz)从资产文件夹复制到 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: open failed: ENOENT (No such file or directory)

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

    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"
        }

【问题讨论】:

  • 您没有创建目录。仅通过调用getDatabasePath() 不会自动创建数据库目录。你需要自己创建它,使用mkdirs()
  • 我明白了,虽然我不明白为什么我在使用 api 24 及更高版本时没有这个问题?
  • 也许较新版本的 Android 会自动创建它。过去从未如此,但 Android 的情况发生了变化。始终调用mkdirs() 是最安全的,因为如果所需目录已经存在,mkdirs() 将什么也不做。
  • 同意!非常感谢您在这件事上的帮助。我希望此修复对其他人也有帮助。

标签: java android database sqlite kotlin


【解决方案1】:

问题可能是 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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多