【问题标题】:Android, What is the right way to write a file to a subdirectory of the data/data/'package' folderAndroid,将文件写入data/data/'package'文件夹的子目录的正确方法是什么
【发布时间】:2015-03-17 02:42:00
【问题描述】:

过去几天我一直在尝试找到将文件写入 android 数据文件夹的子目录的正确方法。 我发现的大多数答案都不清楚,或者没有以正确和有效的方式解决问题,所以我最终决定问。 我通过基本上通过 php 脚本将数据库上传到服务器,为用户提供了在我的服务器上备份他的数据的可能性。 数据库位于

'/data/data/com.package/databases/data.db'

这里的问题是当用户想要重新加载备份的数据库时。 应用程序下载文件,然后将其写入(覆盖旧文件)到 /databases/data.db' 文件,然后重新加载。 我已经设法让一切正常工作,直到我必须写入下载的文件,因为 FileOutputStream 抛出一个非法参数异常,说我不能在路径中使用路径分隔符。 我知道 FileOutputStream 只能写入数据文件夹的第一级,不能写入子目录。 如何才能做到这一点? 如果做不到,有没有办法将默认的数据库路径设置为'data'目录的第一级来解决这个问题? 如果这是我想要获得的完全错误的方法,我愿意接受批评,但得到答案仍然很好,只是为了将来知道。

public void aSyncDatabaseDownloadFileFinish(PhpWrapper feed) {
    if (validateServerResponse(feed.Result)) {
        // Copy Database to Directory
        try {
            FileOutputStream fos = ctx.openFileOutput(ctx.getDatabasePath(DataDatabaseHelper.DBNAME).getAbsolutePath(),
                    Context.MODE_PRIVATE);
            fos.write(feed.DownloadedBytes, 0, feed.DownloadedBytes.length);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else
        Toast.makeText(ctx, ctx.getResources().getString(R.string.nofilesonserver), Toast.LENGTH_SHORT).show();
}

提前致谢。

【问题讨论】:

    标签: android database fileoutputstream illegalargumentexception path-separator


    【解决方案1】:

    如何做到这一点?

    在您的情况下,use getDatabasePath() 将文件写入您应用的数据库的标准位置。

    无论您的路径分隔符有什么问题,openFileOutput() 都将与您内部存储中的files/ 目录一起使用,而不是databases/ 目录。

    【讨论】:

    • 是的!我已经找到并发布了解决方案。感谢您的宝贵时间!
    【解决方案2】:

    好的, 多亏了 Squonk,我得到了答案,仍然无法相信它是如此简单。 对于任何有同样问题的人,这里是一个例子:

    if (validateServerResponse(feed.Result)) {
            // Copy Database to Directory
            try {
                 // This Solved the Exception
                FileOutputStream fos = new FileOutputStream(ctx.getDatabasePath(DataDatabaseHelper.DBNAME), true);
                fos.write(feed.DownloadedBytes, 0, feed.DownloadedBytes.length);
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else
            Toast.makeText(ctx, ctx.getResources().getString(R.string.nofilesonserver), Toast.LENGTH_SHORT).show();
    

    谢谢你!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2011-07-26
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多