android - 将数据库从 Assets 复制到设备数据文件夹时出现 FileNotFoundException

标签 android sqlite assets filenotfoundexception fileoutputstream

我尝试了很多方法将我的 sqlite 数据库文件复制到我的/data/data/packagename/databases 文件夹,但我仍然卡在 FileNotFoundException 中,由 FileOutputStream 对象触发... 这是代码:

public static boolean checkCopyDb(Context c, DbHandler _db) {
    try {
        String destPath = "/data/data/" + c.getPackageName() + "/databases/db_sociallibraries.db";

        File dbFile = new File(destPath);

        if(!dbFile.exists()) {
            _db.copyDb(c.getAssets().open(DB_NAME), new FileOutputStream(destPath)); // Line 44 - Throws the exception
        }
        return true;
    }
    catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

private void copyDb(InputStream inputStream, OutputStream outputStream) throws IOException {

    byte[] buffer = new byte[1024];
    int length;

    while((length = inputStream.read(buffer)) > 0) {
        outputStream.write(buffer,0,length);
    }

    inputStream.close();
    outputStream.close();
}

这是错误:

02-09 01:28:46.384 24222-24222/com.test.michelemadeddu.sociallibraries W/System.err﹕ java.io.FileNotFoundException: /data/data/com.test.michelemadeddu.sociallibraries/databases/db_sociallibraries.db: open failed: ENOENT (No such file or directory) 02-09 01:28:46.384 24222-24222/com.test.michelemadeddu.sociallibraries W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:409) 02-09 01:28:46.384 24222-24222/com.test.michelemadeddu.sociallibraries W/System.err﹕ at java.io.FileOutputStream.(FileOutputStream.java:88) 02-09 01:28:46.384 24222-24222/com.test.michelemadeddu.sociallibraries W/System.err﹕ at java.io.FileOutputStream.(FileOutputStream.java:128) 02-09 01:28:46.384 24222-24222/com.test.michelemadeddu.sociallibraries W/System.err﹕ at java.io.FileOutputStream.(FileOutputStream.java:117) 02-09 01:28:46.384 24222-24222/com.test.michelemadeddu.sociallibraries W/System.err﹕ at com.test.michelemadeddu.sociallibraries.DbHandler.checkCopyDb(DbHandler.java:44)

我做错了什么吗? 谢谢

最佳答案

为了兼容性,也许您可​​以将内部数据库路径更改为以下

if(android.os.Build.VERSION.SDK_INT >= 17) {
   DB_PATH = context.getApplicationInfo().dataDir + "/databases/";         
} else {
   DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}

关于android - 将数据库从 Assets 复制到设备数据文件夹时出现 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28401276/

相关文章:

caching - Heroku 上的 Rails 3.1 Assets 缓存

android - 继承自 AppCompat 工具栏更改工具栏图标边距

android - TextInputEditText - 使可点击但不可编辑

sqlite - 如何实现与 sqlite 和 fireac 的动态链接?

javascript - 如何让 JavaScript 文件在 Rails 5 应用程序上运行

windows-phone-8.1 - Windows phone 8.1 Assets

android - 尝试使用改造 android 使用发布请求和响应,但无法将 org.json.JSONObject$1 之类的错误转换为 JSONArray

android - 了解 fragment 堆栈

自动生成/更新表并使用 SQLite 的 Python ORM?

html - 如何将 html 表单中的日期和时间输入类型存储到 sqlite3 DB 中