lixplor / android-Q-A

🐞 android related questions and answers
0 stars 0 forks source link

SharedPreference中的getStringSet()方法获取已保存数据有偏差 #81

Closed lixplor closed 7 years ago

lixplor commented 7 years ago

步骤:

lixplor commented 7 years ago

Android自身bug: 讨论链接

在调用getStringSet()后获取到的Set, 不能对其进行修改, 修改会导致意想不到的结果. 如果希望获取到Set后增加或减少元素, 可以创建一个新的Set, 将getStringSet()获取到的Set值复制到创建的新Set中, 然后使用新Set进行修改, 并重新保存到SharedPreference, 相当于使用了一个新的对象


// 有问题的方式
Set<String> savedSet = mSharedPreference.getStringSet("key", null);
savedSet.add("someString");  // 对获取到的Set进行修改是错误的
mSharedPreference.putStringSet("key", savedSet);

// 正确的方式
Set<String> savedSet = mSharedPreference.getStringSet("key", null);
Set<String> newSet = new HashSet<>();
if(savedSet != null) {
    newSet.addAll(savedSet); // 将获取到的Set元素复制到新的Set对象
}
newSet.add("someString"); // 使用新Set变更数据
mSharedPreference.putStringSet("key", newSet); // 使用新Set保存