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!