整个ENTIRE SharedPreferences文件的Android备份

时间:2011-08-09 04:26:38

标签: android sharedpreferences database-backups android-backup-service

我一直在尝试在我的Android应用中运行我的sharedpreferences文件的备份,到目前为止还没有。我正在使用开发人员指南中的简单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 个答案:

答案 0 :(得分:1)

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);

将文件夹中的SharedPreferences .xml文件导出到下载目录

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文件,否则它不起作用。

您可以这样做,例如

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

    editor.commit();

如果您在使用SharedPreferences的相同Layout上导入它,您可以使用它来刷新

                        finish();
                        startActivity(getIntent());

答案 1 :(得分:0)

您传递给addHelper 的密钥不是您在SharedPreferences中使用的密钥。这是从您添加的所有帮助程序中识别此特定帮助程序的关键。 SharedPreferencesBackupHelper会备份您告诉它的每个SharedPreferences文件中的每个值。

如果您的SharedPreferences没有备份,则原因不同。检查SharedPreferences文件的名称是否正确,以及您是否在AndroidManifest.xml的<meta-data>标记中正确指定了密钥。

答案 2 :(得分:0)

获取共享首选项文件备份非常简单。请找到以下示例以便更好地理解:

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)

    }
}

答案 3 :(得分:0)

这对我来说是一个挑战,但我明白了。希望它将对某人有用。 〜安:-)

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();
              }

           }