Android резервное копирование и восстановление базы данных и с SD-карты - PullRequest
5 голосов
/ 11 сентября 2011

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

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

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

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

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

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

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

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

Kr,

Dirk

Ответы [ 2 ]

0 голосов
/ 11 сентября 2011

Я всегда использую 1.). Вот мой класс, который делает резервное копирование БД на SD-карту. Я использую FileUtils из Apache commons-io здесь, вам нужно изменить это, если вы не используете этот jar. Кроме того, в вашем классе 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();
    }
}
0 голосов
/ 11 сентября 2011

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

...