【发布时间】: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