【问题标题】:How to migrate SharedPrefs to DefaultSharedPrefs?如何将 SharedPrefs 迁移到 DefaultSharedPrefs?
【发布时间】: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


    【解决方案1】:

    恐怕您的情况没有简单的解决方案。至少你可以在你的应用开始的时候引入一些迁移方法(扩展Application类?)

    首先获取旧的ShardedPreferences ("settings"),然后是iterate through,并将值写入DefaultSharedPreferences,在每个remove key 之后或最后remove whole old file (API24+)。在这种方法中,您可以引入 "ON"/"OFF" -> boolean 迁移以获得更清晰的代码(因为您进行了重构)

    【讨论】:

    • 我刚刚做到了,我唯一跳过的是迭代,因为在某些情况下,值并非全是字符串,请检查我的问题编辑,谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2019-05-15
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多