Запись базы данных на sdcard

Запись базы данных на 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) {}
    }
Поделись с друзьями:

Оставьте комментарий