将文件从Assets复制到/ data / data

时间:2014-11-20 22:30:35

标签: android file-permissions copy-paste

我在同一个问题上看过并尝试了十几个回复,但我没有运气。

我是Android开发的新手,但是来自Java / C#背景我非常肯定,我试图做的事情,不是火箭科学。

不幸的是我无法使用我所使用的设备,所以请不要对root用户进行任何评论,正如标题所示,我只需要将文件从/ assets /文件夹复制到/ data / data /目录下。我的设备。

以下是我使用的代码:

private void copyDatabase(File dbFile) throws IOException {
    InputStream is = context.getAssets().open(DB_NAME);
    OutputStream os = new FileOutputStream(dbFile);

    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        os.write(buffer);
    }

    os.flush();
    os.close();
    is.close();
} 

这真的不简单,我有一个名为DB_NAME的静态字段,它指向assets文件夹。调试此行,证明所需文件已识别并输出到内存成功。

失败的行是下一行:... new FileOutputStream(dbFile);我从另一个方法传入。

dbFile的构造如下:

File dbFile = context.getDatabasePath(DB_NAME);

再一次,没什么特别的。这会抓取当前上下文(应用程序)的数据库路径,并将数据库的名称附加到该路径,因此为了论证,我们有,

/data/data/co.za.simple.sqlite/database/sqlitedb.db

错误消息是文件或目录不存在,这对于将要下载应用程序的任何普通用户首次加载是正常的,现在是FileOutputStream(string)的默认行为,据我所知如果它不存在,它将创建它。

如上所述,首先运行,此文件不存在,但是,它给出了一个错误,指出无法找到文件或目录。这让我相信实际的错误是应用程序没有写入/ data /目录的权限,因此我添加了我在列表中看到的唯一权限,这些权限适用于写入存储:< / p>

android.permission.WRITE_EXTERNAL_STORAGE

然而这绝对没有效果。

如上所述,我无法使用此设备,此时我也不想这样做。

我已经浏览了无数的博客,youtube观点甚至是关于完全相同问题的线索,并且这些解决方案都不适用。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

new FileOutputStream(stuff)期望放置文件的目录存在。它会创建文件,如果它不存在但它不会创建路径。丢失路径的结果是FileNotFoundException

任何正在运行的应用都应该有一个现有的/data/data/[packagename]/目录。但任何子目录都是可选的。 context的大多数方法都会在您请求后为您创建目录。 getDatabasePath出于某种原因没有。

添加

dbFile.getParentFile().mkdirs();
在创建流之前

应该解决问题。如果您不使用该权限,也可以删除该权限。您的私人目录不需要任何。

或者使用https://github.com/jgilfelt/android-sqlite-asset-helper也可以修复它,甚至更多的角落情况。