Резервное копирование и восстановление базы данных Android на SD-карту и с нее

В настоящее время я пытаюсь создать функцию резервного копирования в своем приложении для Android. Однако я немного борюсь, прежде чем даже начать его реализовывать, потому что я не уверен, как правильно идти.

Я нашел несколько интересных статей в сети и придумал три возможных решения:

  1. Резервное копирование всего файла БД на SD-карту
  2. Экспорт данных БД в файл XML на SD-карте
  3. Используйте механизм резервного копирования Android для резервного копирования всей БД в облако Google.

Теперь мне интересно, что вы, ребята, думаете об этих трех решениях, или вы знаете другой (может быть, даже лучший способ) и какой, на ваш взгляд, лучший путь?

Вот мои замечания о возможных реализациях:

  1. Я не знаю, если телефон не рутирован, можно ли восстановить файл БД ... В противном случае, я думаю, в этом нет никаких недостатков ...
  2. Обработка XML-файлов на лету на телефонах Android тяжела, поэтому, если этого можно избежать, лучше не делать этого так.
  3. Используя механизм резервного копирования Android, функция резервного копирования доступна только в том случае, если она включена пользователем на телефоне, и все данные должны быть скопированы в облако... Что в моем случае может быть в некоторых случаях довольно много...

Жду комментариев по этому вопросу!

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

Kr,

Кортик


person dirkvranckaert    schedule 11.09.2011    source источник


Ответы (2)


Я всегда использую 1.). Вот мой класс, который делает резервную копию БД на SD-карту. Я использую FileUtils из Apache commons-io здесь, вам нужно изменить это, если вы не используете эту банку. Кроме того, в вашем классе SQLiteOpenHelper (здесь MySQLiteOpenHelper.getDatabaseName()) необходим метод, который возвращает имя файла вашей базы данных.

Вы вызовете это из AsyncTask в одном из своих действий...

public class MyDatabaseTools {
  private String appName = "";
  private String packageName = "";

  public boolean backup() {
    boolean rc = false;

    boolean writeable = isSDCardWriteable();
    if (writeable) {
      File file = new File(Environment.getDataDirectory() + "/data/" + packageName + "/databases/" + MySQLiteOpenHelper.getDatabaseName());

      File fileBackupDir = new File(Environment.getExternalStorageDirectory(), appName + "/backup");
      if (!fileBackupDir.exists()) {
        fileBackupDir.mkdirs();
      }

      if (file.exists()) {
        File fileBackup = new File(fileBackupDir, MySQLiteOpenHelper.getDatabaseName());
        try {
          fileBackup.createNewFile();
          FileUtils.copyFile(file, fileBackup);
          rc = true;
        } catch (IOException ioException) {
          //
        } catch (Exception exception) {
          //
        }
      }
    }

    return rc;
  }

  private boolean isSDCardWriteable() {
    boolean rc = false;

    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
      rc = true;
    }

    return rc;
  }

    public MyDatabaseTools(final Context context, final String appName) {
        this.appName = appName;
        packageName = context.getPackageName();
    }
}
person Harald Wilhelm    schedule 11.09.2011
comment
Пример похож на те, которые я нашел во время моего исследования. Я, вероятно, к этому пути. Спасибо за помощь! - person dirkvranckaert; 12.09.2011
comment
Это не упоминает восстановление базы данных. - person Stealth Rabbi; 12.08.2014
comment
@ Харальд, я понимаю твой ответ. это полезно для развития. но не могли бы вы поделиться своим предложением, когда нам нужно переместить базу данных в другой каталог, например, время удаления, время установки и т. д.? ждем ваших положительных отзывов - person Teraiya Mayur; 06.01.2017

Вам не нужно иметь рутированный телефон, чтобы восстановить базу данных из файла на SD-карте. Каждое приложение может записывать в свои частные каталоги, поэтому вы можете просто скопировать файл. Что касается 2, у вас есть конкретные цифры? Обработка XML происходит довольно быстро, и, поскольку это резервное копирование/восстановление, это происходит не слишком часто, и пользователи ожидают, что это займет некоторое время, поэтому это не должно быть проблемой. Как обычно, прежде чем принимать какие-либо решения, измерьте фактическое время, которое требуется, и подумайте, сколько данных у вас есть.

person Nikolay Elenkov    schedule 11.09.2011
comment
Хорошо, но если 1) возможно, то зачем вообще тратить время на создание каких-то общих вещей для резервного копирования всех таблиц и их данных, а не просто копировать всю базу данных? Есть ли у этого известные недостатки? - person dirkvranckaert; 12.09.2011
comment
Это зависит от того, если вам это не нужно, не пишите. Возможно, вам нужно импортировать данные в другие программы, и XML/CSV/JSON может быть лучшим выбором. Маловероятно, но версия SQLite в Android 5.0 может быть несовместима с текущим форматом и т. д. - person Nikolay Elenkov; 12.09.2011