我一直在尝试在我的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
文件?
答案 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();
}
}