您好,有一个问题,我无法将数据库(称为 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/