2017-08-30 93 views
0

在我们的应用程序中,我们使用了PreferenceManager.getDefaultSharedPreferences作为共享首选项。我们现在需要使用一个命名的prefs实例(用于A/B测试)。将SharedPreferences迁移到新的SharedPreferences

所以,现在我们使用context.getSharedPreferences(context.getString(R.string.app_name), Context.MODE_PRIVATE)

我需要做的是所有存储的偏好设定的移动从旧的实例到新的一个什么拿到首选项。有没有简单的解决方案来做到这一点?

我能够获得旧的prefs的地图,但不知道如何将它写入新的prefs,因为写入需要类型(“putInt”,“putString”等)。

此处,我已经打了一个路障:

private void convertToPrivateSharedPrefsIfNeeded() { 
    SharedPreferences oldPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    Map<String, ?> oldPrefsMap = oldPrefs.getAll(); 

    SharedPreferences newPrefs = getSharedPreferences(getString(R.string.app_name), Context.MODE_PRIVATE); 
    for (Map.Entry<String, ?> entry : oldPrefsMap.entrySet()) { 

    } 

} 

我猜,我在正确的轨道上,但不知道要放什么东西在for循环这里

回答

2

一种解决方案可能涉及检查每种受支持类型的返回类型entry.getValue(),并在编辑器对象上调用相关方法。例如。

for (Map.Entry<String, ?> entry : oldPrefsMap.entrySet()) { 
    Object current = entry.getValue(); 
    if (current instanceof Integer) { 
      newPrefs.edit().putInt(...); 
    } else if (current instanceof ....) {} 
} 

对于SharedPreference支持的原始类型应该这样做。 或者,您可以尝试重命名该文件。该文件的路径是

/data/data/your.app.package/shared_prefs/ 

和您的应用程序应该能够访问该目录直接

+0

其实我不知道,你可以重命名共享的首选项文件。这真是太棒了!我自己也没有检查价值的类型...在那里的伟大建议 – Psest328