Простой экспорт и импорт базы данных SQLite на Android

Я пытаюсь реализовать простой SQLite экспорт / импорт для целей резервного копирования. Экспорт – это просто вопрос сохранения копии файла raw current.db . Что я хочу сделать для импорта, так это просто удалить старый файл current.db и переименовать файл imported.db в current.db . Это возможно? Когда я пытаюсь это решение, я получаю следующую ошибку:

 06-30 13:33:38.831: ERROR/SQLiteOpenHelper(23570): android.database.sqlite.SQLiteDatabaseCorruptException: error code 11: database disk image is malformed 

Если я посмотрю на необработанный файл базы данных в SQLite браузере, он выглядит нормально.

Я использую этот код в SQLiteOpenHelper в одном из моих приложений для импорта файла базы данных.

EDIT: я вставил свой FileUtils.copyFile() в вопрос.

SQLiteOpenHelper

 public static String DB_FILEPATH = "/data/data/{package_name}/databases/database.db"; /** * Copies the database file at the specified location over the current * internal application database. * */ public boolean importDatabase(String dbPath) throws IOException { // Close the SQLiteOpenHelper so it will commit the created empty // database to internal storage. close(); File newDb = new File(dbPath); File oldDb = new File(DB_FILEPATH); if (newDb.exists()) { FileUtils.copyFile(new FileInputStream(newDb), new FileOutputStream(oldDb)); // Access the copied database so SQLiteHelper will cache it and mark // it as created. getWritableDatabase().close(); return true; } return false; } 

FileUtils

 public class FileUtils { /** * Creates the specified toFile as a byte for byte copy of the * fromFile. If toFile already exists, then it * will be replaced with a copy of fromFile. The name and path * of toFile will be that of toFile.
*
* Note: fromFile and toFile will be closed by * this function. * * @param fromFile * - FileInputStream for the file to copy from. * @param toFile * - FileInputStream for the file to copy to. */ public static void copyFile(FileInputStream fromFile, FileOutputStream toFile) throws IOException { FileChannel fromChannel = null; FileChannel toChannel = null; try { fromChannel = fromFile.getChannel(); toChannel = toFile.getChannel(); fromChannel.transferTo(0, fromChannel.size(), toChannel); } finally { try { if (fromChannel != null) { fromChannel.close(); } } finally { if (toChannel != null) { toChannel.close(); } } } } }

Не забудьте удалить старый файл базы данных, если это необходимо.

Это простой способ экспортировать базу данных в папку с именем backup, которую вы можете назвать так, как хотите, и простой метод для импорта базы данных из той же папки

  public class ExportImportDB extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //creating a new folder for the database to be backuped to File direct = new File(Environment.getExternalStorageDirectory() + "/Exam Creator"); if(!direct.exists()) { if(direct.mkdir()) { //directory is created; } } exportDB(); importDB(); } //importing database private void importDB() { // TODO Auto-generated method stub try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath= "//data//" + "PackageName" + "//databases//" + "DatabaseName"; String backupDBPath = "/BackupFolder/DatabaseName"; File backupDB= new File(data, currentDBPath); File currentDB = 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(getBaseContext(), backupDB.toString(), Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } } //exporting database private void exportDB() { // TODO Auto-generated method stub try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath= "//data//" + "PackageName" + "//databases//" + "DatabaseName"; String backupDBPath = "/BackupFolder/DatabaseName"; 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(getBaseContext(), backupDB.toString(), Toast.LENGTH_LONG).show(); } } catch (Exception e) { Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG) .show(); } } } 

Не забудьте добавить это разрешение, чтобы продолжить

    

наслаждаться

  • Создать папку в Android
  • Android написать в папку sd card
  • добавление ресурсов в intellij для проекта java
  • Каков наиболее подходящий способ хранения пользовательских настроек в приложении Android
  • Консоль Netbeans не отображает символы юникода Bangla
  • Получите силу сигнала Bluetooth
  • Метод getText () должен быть вызван из streamа пользовательского интерфейса (Android Studio)
  • Почему добавление OnClickListener внутри onBindViewHolder из RecyclerView.Adapter считается плохой практикой?
  • String.replaceAll без RegEx
  • Продвижение на Java?
  • getString вне контекста или действия
  • Interesting Posts

    Как скрыть окно cmd во время запуска пакетного файла?

    Ошибка: неожиданный символ / ввод / строка константа / числовая константа / SPECIAL в моем коде

    Разница во времени между двумя датами в Java?

    Неправильно ли использовать устаревшие методы или classы в Java?

    Как я могу выйти из Skype со всего входа в мою учетную запись?

    Как понять статическую форму и динамическую форму в TensorFlow?

    Существует ли игла Haskell для обновления вложенной структуры данных?

    Backspace в Google Chrome не «назад к последней странице»?

    Как читать / писать строки из файла на Android

    Как вы копируете содержимое массива в std :: vector в C ++ без цикла?

    Как вызвать службу геокодирования Google из кода C #

    Файл заблокирован / доступен только для чтения

    Изменение частоты кадров в ffmpeg без перекодирования

    Преобразование String в Int в EF 4.0

    Отправка форматированного текстового сообщения Lotus Notes из Excel VBA

    Давайте будем гением компьютера.