SharedPreference Set <string>在每次重新创建活动时重置</string>

时间:2013-12-23 08:16:12

标签: java android set sharedpreferences

为了便于阅读,我的代码将被简化。

获取Set并为其添加密码的方法:

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保留活动后添加到其中的第一个值重新创建。

我已经排除了一段时间后无法解决问题。如有必要,我可以提供有关如何以及何时使用此代码的更多详细信息。我希望我不需要,有人可以在代码中指出问题,如图所示。

3 个答案:

答案 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的答案。这家伙做的是:

  • 将第一个值作为字符串集添加到SharedPreferences。
  • 要添加后续值,请先将现有的pref读入 new 字符串集。
  • 删除旧的字符串集键。
  • 修改新字符串集以添加要存储的新值。
  • 将新字符串集添加到首选项。

虽然这是一种漫长而愚蠢的做事方式,但它似乎是最后一种选择。所以基本上,一次性存储你想要存储的所有值(不是分期付款)。如果要添加新值,请删除旧密钥,使用旧的+新值创建新密钥,然后存储新密钥。

希望有所帮助。