Запись базы данных на sdcard может пригодится для создания Backup базы данных. Если в вашем приложении пользователь сохраняет какие то свои данные, то скорее всего он не захочет их потерять после переустановки приложения, для этого следует предусмотреть возможность Backup базы данных. В идеале конечно лучше использовать сетевую базу данных, но автономная база данных на устройстве в некоторых случаях даже удобнее и быстрее и этот случай более распространён. Представьте, что у вас приложение с заметками, и вы их делали в течении длительного периода, если у вас будет функция создания Backup то сохранность заметок сильно повышается.
Метод exportDB на вход получает Context, имя базы данных и имя пакета. Получаем файл sd с карты памяти. Создаём файл data в памяти устройства.
Если возможно прочитать файл с sd то выполняем следующие действия иначе выводим сообщение, что файл на карте памяти не доступен.
Прописываем путь к файлу в памяти устройства currentDBPath.
Прописываем путь к файлу на карте памяти backupDBPath.
Создаём входящий поток src и исходящий поток dst. В исходящий поток пишем входящий поток командой dst.transferFrom (src, 0, src.size());
Закрываем входящий и исходящий потоки .close.
Всё, файл записан на карту памяти (т.е. запись базы данных на sdcard из основной памяти устройства выполнен).
Вы можете сказать, зачем это нужно. Ведь можно войти в память устройства и скопировать базу данных. Но всё не так просто. Для доступа к основной памяти нужен ROOT, а есть он не у всех. Да и не каждый пользователь будет такие заморочки для Backup проделывать.
// Запись БД на sdcard
public static void exportDB(Context context, String dbName, String packageName){
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
String currentDBPath= "//data//" + packageName + "//databases//" + dbName;
String backupDBPath = "/Download/" + dbName;
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Toast.makeText(context, "Данные экспортированы", Toast.LENGTH_LONG).show();
} else { Toast.makeText(context, "Данные не экспортированы", Toast.LENGTH_LONG).show(); }
} catch (Exception e) {}
}