Резервное копирование Android всего файла SharedPreferences - PullRequest
3 голосов
/ 09 августа 2011

Я пытался заставить резервную копию моего файла sharedpreferences в моем приложении для Android работать, и пока это не так. Я использую простой код Google из руководства разработчика. Ниже приведен код класса MyPrefsBackup.

public class MyPrefsBackup extends BackupAgentHelper {

    // The name of the SharedPreferences file

    static final String PREFS = "UserDB";

    // A key to uniquely identify the set of backup data

    static final String PREFS_BACKUP_KEY = "prefs";

    // Allocate a helper and add it to the backup agent

  public  void onCreate() {

        SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS);
        addHelper(PREFS_BACKUP_KEY, helper);


    }

Мне кажется, я наконец понял, что PREFS_BACKUP_KEY на самом деле должен быть конкретным ключом, под которым я хранил данные. Я просто использовал «prefs», так что я думаю, поэтому не было никаких резервных копий данных. Тем не менее, я храню довольно много данных в файле SharedPreferences, так как я могу сохранить и сохранить все файлы SharedPreferences без указания каждого отдельного ключа. (некоторые ключи генерируются приложением, поэтому я даже не знаю, используются ли они, пока пользователь не введет свои данные).

Я хочу знать, есть ли способ просто указать классу BackupHelper сделать резервную копию всего файла SharedPreferences?

Ответы [ 4 ]

1 голос
/ 12 мая 2016

Пример SharedPreferences

SharedPreferences preferences=getSharedPreferences("Test", getApplicationContext().MODE_MULTI_PROCESS)

Дата для резервной папки

Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("dd_MMMM_yyyy HH_mm_ss");
            String strDate = sdf.format(c.getTime());

Экспорт SharedPreferences

exportSH("Test.xml", strDate);

Экспорт XML-файла SharedPreferences в папке в папкуКаталог загрузок

private void exportSH(String sh_name, String strDate){




        File sd = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + 
                File.separator + "Backup Folder "+strDate+ 
                File.separator );

          boolean success = true;
           if (!sd.exists()) {
               success = sd.mkdir();
           }
           if (success) {

        File data = Environment.getDataDirectory();
       FileChannel source=null;
       FileChannel destination=null;
       String currentDBPath = "/data/"+ context.getPackageName() +"/shared_prefs/"+ sh_name;
       String backupDBPath = sh_name;
       File currentDB = new File(data, currentDBPath);
       File backupDB = new File(sd, backupDBPath);
       try {
            source = new FileInputStream(currentDB).getChannel();
            destination = new FileOutputStream(backupDB).getChannel();
            destination.transferFrom(source, 0, source.size());
            source.close();
            destination.close();
            Toast.makeText(this, "Done", Toast.LENGTH_SHORT).show();
        } catch(IOException e) {
            e.printStackTrace();
Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show();
        }
           }}

Вы можете импортировать файлы с небольшими изменениями.Некоторые люди говорили, что это не будет так легко, но работает.Просто убедитесь, что вы создали пустой файл Sharedpreferences File перед импортом, потому что в противном случае он не будет работать.

Вы можете сделать это, например,

    SharedPreferences dummy = getSharedPreferences("dummy", getApplicationContext().MODE_MULTI_PROCESS);
                Editor editor = dummy.edit();
editor.putBoolean("asdf", true);

    editor.commit();

И если вы импортируете его на тот жеМакет, где используются SharedPreferences, вы можете использовать это для обновления

                        finish();
                        startActivity(getIntent());
0 голосов
/ 14 октября 2018

Мне было сложно разобраться, но я понял.Надеюсь, это будет кому-то полезно.~ Ann: -)

Ответ ORY сработает, но вам нужно будет полностью выйти из приложения, чтобы загрузить новую настройку.Это обновление его метода и способ импортировать Sharepreference.Тосты не будут отображаться при перезапуске через этот метод.** Помните, что вам нужно будет создать файл .xml, если его не было.Этот метод использовал «TransferFrom».Вам также необходимо переопределить функцию backpressed (), чтобы очистить действие, поскольку это создаст слои действий.

Для выполнения:

importSH ("App_settings.xml", "/ TodoFolder / Backup/ ");

Метод:

    private void importSH(String sh_name, String location){


          File sd = new File(Environment.getExternalStorageDirectory().
                  getAbsolutePath() +location);


         File data = Environment.getDataDirectory();
         FileChannel source=null;
         FileChannel destination=null;
         String currentDBPath = "/data/"+ ToDoListActivity.this.getPackageName() +"/shared_prefs/"+ sh_name;
         String backupDBPath = sh_name;
         File currentDB = new File(sd, backupDBPath);
         File backupDB = new File(data, currentDBPath);



             try {
                  source = new FileInputStream(currentDB).getChannel();
                  destination = new FileOutputStream(backupDB).getChannel();

                  destination.transferFrom(source, 0, source.size());
                  source.close();
                  destination.close();

 // Toast.makeText(this, "App need to exit to load new setting", Toast.LENGTH_SHORT).show(); //will not show when rebooting. Not sure how to fix it.

                  String value =shared.getString("Demo List",null);
                     if (value != null) {

                         shared.edit().remove("Demo List").commit(); //remove the item created by dummy SharedPreferences, as mention. 
                     } 

 //restartin app to original activity.
                     Intent mStartActivity = new Intent(ToDoListActivity.this, ToDoListActivity.class);
                       int mPendingIntentId = 123456;
                       PendingIntent mPendingIntent = PendingIntent.getActivity(ToDoListActivity.this, mPendingIntentId,    mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
                       AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                       mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
                       System.exit(0);

              } catch(IOException e) {
                  e.printStackTrace();
                  Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show();
              }

           }  
0 голосов
/ 26 августа 2014

Получение резервных копий файлов с общими настройками было простым делом.Пожалуйста, найдите приведенный ниже пример, чтобы понять его гораздо лучше:

SharedPreferences sharedPref = getSharedPreferences("EmpDetails", MODE_PRIVATE);
Editor prefEditor = sharedPref.edit();
prefEditor.putString("empName1", "valuelabs");
prefEditor.putString("empName2", "webmd");
prefEditor.commit();

Итак. Если вы хотите получить резервную копию для файлов общих настроек, вам необходимо использовать приведенную ниже логику.Здесь вы можете получить доступ на основе вашего ключа, если требуются значения.

public class MyPrefsBackup extends BackupAgentHelper {

    // The name of the SharedPreferences file
    static final String PREFS = "EmpDetails";
   // A key to uniquely identify the set of backup data
    static final String PREFS_BACKUP_KEY = "PREF";

  public  void onCreate() {

        SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS);
        addHelper(PREFS_BACKUP_KEY, helper)

    }
}
0 голосов
/ 21 марта 2013

Ключ, который вы передаете addHelper , не является ключом, который вы используете внутри SharedPreferences. Это ключ, который идентифицирует этого конкретного помощника из всех добавленных вами помощников. SharedPreferencesBackupHelper создает резервную копию каждого значения в каждом файле SharedPreferences, о котором вы ему говорите.

Если ваши SharedPreferences не резервируются, это по другой причине. Убедитесь, что имя файла SharedPreferences правильное, и что вы правильно указали свой ключ в теге <meta-data> в файле AndroidManifest.xml.

...