【发布时间】:2021-09-30 09:02:34
【问题描述】:
我有一个问题,我正在重构我多年前编写的应用程序,我已经更改了整个设置活动,它首先是一个带有自定义复选框和编辑文本的简单活动,它将数据保存在自定义 SharedPrefs“设置”。
今天我用root_preferences重写了整个设置,所以旧数据和新数据保存在不同的SharedPrefs中,旧数据在SharedPrefs“设置”中,新数据在DefaultSharedPreferences中,另一点是,在旧的设置页面中,所有开关值都保存为字符串,例如如果开关打开,我将保存“打开”,否则保存“关闭”,我什至会通过简单地将 SwitchPreferenceCompat 保存的值设置为"ON" / "OFF" 使其更简单。
我应该采取哪种方式将SharedPrefs从设置“迁移”到DefaultSharedPrefs?
好像我现在将应用程序更新给某人,它仍会从 SharedPrefs 设置中读取值,并且新设置页面中设置的数据将无用...
编辑: 在遵循@snachmsm raccomandations 之后,我最终通过重用此answer 中的代码对应用程序进行了版本检查(检查它是第一次运行还是具有旧设置活动的旧版本) '刚刚制作了一个功能,使整个偏好从旧值和旧共享偏好迁移到新的。
我的代码如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(this);
checkFirstRun(sharedPreferences);
}
private void checkFirstRun(SharedPreferences sharedPreferences) {
final String PREFS_NAME = "FirstRun";
final String PREF_VERSION_CODE_KEY = "version_code";
final int DOESNT_EXIST = -1;
int currentVersionCode = BuildConfig.VERSION_CODE;
SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST);
// Check for first run or upgrade
if (currentVersionCode == savedVersionCode) {
return;
} else if (savedVersionCode == DOESNT_EXIST) {
migratePreferences(sharedPreferences);
} else if (currentVersionCode > savedVersionCode) {
// UPGRADE
}
// Update the shared preferences with the current version code
prefs.edit().putInt(PREF_VERSION_CODE_KEY, currentVersionCode).apply();
}
private void migratePreferences(SharedPreferences sharedPreferences) {
SharedPreferences oldPrefs = getSharedPreferences("settings",MODE_PRIVATE);
if (oldPrefs.getAll().size() == 0) {
return;
}
SharedPreferences.Editor preferencesEditor = sharedPreferences.edit();
preferencesEditor.putString("ip", oldPrefs.getString("ip", "10.0.0.51"));
preferencesEditor.putString("txtArt", oldPrefs.getString("txtArt", "10.0.0.51"));
preferencesEditor.putString("txtTasti", oldPrefs.getString("txtTasti", "10.0.0.51"));
preferencesEditor.putString("txtTerm", oldPrefs.getString("txtTerm", "1"));
preferencesEditor.putString("txtColonne", oldPrefs.getString("txtColonne", "4"));
preferencesEditor.putString("varianti", String.valueOf(oldPrefs.getInt("varianti", 5)));
preferencesEditor.putString("turni", String.valueOf(oldPrefs.getInt("turni", 0)));
preferencesEditor.putBoolean("sottoTavoli", oldPrefs.getString("sottoTavoli", "OFF").equals("ON"));
preferencesEditor.putBoolean("prezzoTasto", oldPrefs.getString("prezzoTasto", "OFF").equals("ON"));
preferencesEditor.putBoolean("chiediConto", oldPrefs.getString("chiediConto", "OFF").equals("ON"));
preferencesEditor.putBoolean("prossimoTurno", oldPrefs.getString("prossimoTurno", "OFF").equals("ON"));
preferencesEditor.putBoolean("prezz", oldPrefs.getString("prezz", "OFF").equals("ON"));
preferencesEditor.putBoolean("switchMsg", oldPrefs.getString("switchMsg", "OFF").equals("ON"));
preferencesEditor.putBoolean("soloSotto", oldPrefs.getString("soloSotto", "OFF").equals("ON"));
preferencesEditor.putBoolean("night", oldPrefs.getString("night", "OFF").equals("ON"));
preferencesEditor.putBoolean("tastiLaterali", oldPrefs.getString("tastiLaterali", "OFF").equals("ON"));
preferencesEditor.putBoolean("famSwitch", oldPrefs.getString("famSwitch", "OFF").equals("ON"));
preferencesEditor.putBoolean("riproponiTurno", oldPrefs.getString("riproponiTurno", "OFF").equals("ON"));
preferencesEditor.putBoolean("ricaricatasti", oldPrefs.getString("famSwitch", "OFF").equals("ON"));
preferencesEditor.putBoolean("order", oldPrefs.getBoolean("order", false));
preferencesEditor.putBoolean("fidelity", oldPrefs.getBoolean("order", false));
preferencesEditor.apply();
// Deleting all old prefs.
oldPrefs.edit().clear().apply();
}
【问题讨论】:
标签: android