Android, Как правильно записать файл в подкаталог папки data/data/'package'

Последние пару дней я пытался найти правильный способ записи файла в подкаталог папки данных 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();
}

Заранее спасибо.

2 ответа

Как это может быть сделано?

В вашем случае используйтеgetDatabasePath() записать файл в стандартное место для баз данных для вашего приложения.

Независимо от вашей проблемы с разделителем пути, openFileOutput() будет работать с files/ каталог во внутренней памяти, а не databases/ каталог.

Хорошо, я получил ответ благодаря 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();

Спасибо, Squonk!

Другие вопросы по тегам