I’m trying to store a set of strings using the
Set<String> s = sharedPrefs.getStringSet("key", new HashSet<String>()); s.add(new_element); SharedPreferences.Editor editor = sharedPrefs.edit(); editor.putStringSet(s); edit.commit()
The first time I execute the code above,
s is set to the default value (the just created end empty
HashSet) and it is stored without problems.
The second and next times I execute this code, a
s object is returned with the first element added. I can add the element, and during the program execution, it is apparently stored in the
SharedPreferences, but when the program is killed, the
SharedPreferences read again from its persistent storage and the newer values are lost.
How can the second, and elements after that, be stored so they won’t get lost?
This “problem” is documented on
SharedPreferences.getStringSet returns a reference of the stored HashSet object
SharedPreferences. When you add elements to this object, they are added in fact inside the
That is ok, but the problem comes when you try to store it: Android compares the modified HashSet that you are trying to save using
SharedPreferences.Editor.putStringSet with the current one stored on the
SharedPreference, and both are the same object!!!
A possible solution is to make a copy of the
Set<String> returned by the
Set<String> s = new HashSet<String>(sharedPrefs.getStringSet("key", new HashSet<String>()));
s a different object, and the strings added to
s will not be added to the set stored inside the
Other workaround that will work is to use the same
SharedPreferences.Editor transaction to store another simpler preference (like an integer or boolean), the only thing you need is to force that the stored value are different on each transaction (for example, you could store the string set size).