Java android-无法从资产文件夹复制数据库:API<;24

Java android-无法从资产文件夹复制数据库:API<;24,java,android,database,sqlite,kotlin,Java,Android,Database,Sqlite,Kotlin,Hi有一个问题,即我无法将我的数据库(称为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

Hi有一个问题,即我无法将我的数据库(称为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:enoint(没有这样的文件或目录)

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

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

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

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

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

您没有创建目录。仅通过调用
getDatabasePath()
不会自动创建数据库目录。您需要自己创建它,使用
mkdirs()
。我明白了,尽管我不明白为什么api 24及以上版本没有这个问题?也许新版本的Android会自动创建它。以前从来都不是这样,但安卓系统的情况发生了变化。始终调用
mkdirs()
是最安全的,因为如果所需目录已经存在,
mkdirs()
将不做任何事情。同意!非常感谢你在这件事上的帮助。我希望这个修正也能帮助其他人。