为了便于阅读,我的代码将被简化。
public void addPass(String pass)
{
// Get the current list.
SharedPreferences sp = getSharedPreferences("passes", 0);
SharedPreferences.Editor editor = getSharedPreferences("passes", 0).edit();
Set<String> passes = sp.getStringSet("myStrings", new HashSet<String>());
// Add the new value.
passes.add(pass);
// Save the list.
editor.putStringSet("myStrings", passes);
editor.commit();
}
public Set<String> getPasses()
{
SharedPreferences sp = getSharedPreferences("passes", 0);
return sp.getStringSet("myStrings", new HashSet<String>());
}
Set<String> x = getPasses();
String[] passes = x.toArray(new String[0]); // convert the set to array
toast(Arrays.toString(passes)); // test what the set looks like
我将集合转换为数组,因为我更容易使用数组测试条件。
EditText password1 = new EditText(this);
String p1 = password1.getText().toString();
addPass(p1.trim()); // add it to the set
toast("Account successfully created.");
当我第一次运行此代码时,我添加了三个字符串值:"a"
,"b"
,"c"
(按此顺序)。
所有值都已正确添加到Set
,并通过上面的代码行确认:
toast(Arrays.toString(passes)); // test what the set looks like
在[b, c, a]
添加到集合后输出"c"
。
问题在于,当我关闭应用并重新打开时,Set
仅包含"a"
。
我可以再次添加"b"
和"c"
值,但周期只会继续Set
只保留活动后添加到其中的第一个值重新创建。
我已经排除了一段时间后无法解决问题。如有必要,我可以提供有关如何以及何时使用此代码的更多详细信息。我希望我不需要,有人可以在代码中指出问题,如图所示。
答案 0 :(得分:2)
正在为同一问题寻找解决方案,解决方案就是
// Get the current list.
SharedPreferences sp = getSharedPreferences("passes", 0);
SharedPreferences.Editor editor = getSharedPreferences("passes", 0).edit();
Set<String> passes = sp.getStringSet("myStrings", new HashSet<String>());
//Make a copy, update it and save it
Set<String> newPasses = new HashSet<String>();
newPasses.add(pass);
newPasses.addAll(passes);
editor.putStringSet("myStrings", newPasses); editor.commit();
答案 1 :(得分:1)
可能是您的问题源于使用getStringSet(),请查看docs:
public abstract Set<String> getStringSet (String key, Set<String> defValues)
从首选项中检索一组String值。
请注意,您必须不修改此调用返回的set实例。如果您这样做,则无法保证存储数据的一致性,也无法根据您的能力修改实例。
答案 2 :(得分:1)
基于此doc和此SO Post有关与您完全相同的问题,您似乎应该创建HashSet返回实例的新副本,而你似乎已经这样做了,至少从你在这里粘贴的代码开始。也许还有其他一些错过的东西。
但是,请查看此post的答案。这家伙做的是:
虽然这是一种漫长而愚蠢的做事方式,但它似乎是最后一种选择。所以基本上,一次性存储你想要存储的所有值(不是分期付款)。如果要添加新值,请删除旧密钥,使用旧的+新值创建新密钥,然后存储新密钥。
希望有所帮助。