SharedPreferences putStringSet不起作用

hen*_*343 13 android sharedpreferences

我需要将Set放入SharedPreference中,但我遇到了问题.

当我单击按钮时,我将从SharedPreference获取Set并将数据添加到Set然后放回SharedPreference,但是当我销毁项目并再次打开它时,sharedPreference只在Set中获取一个字符串

SharedPreferences s = getSharedPreferences("db", 0);
Log.i("chauster", "1.set = "+s.getStringSet("set", new HashSet<String>()));

Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new Button.OnClickListener() {

    @Override
    public void onClick(View v) {
        SharedPreferences ss = getSharedPreferences("db", 0);
        Set<String> hs = ss.getStringSet("set", new HashSet<String>());
        hs.add(String.valueOf(hs.size()+1));
        Editor edit = ss.edit();
        edit.putStringSet("set", hs);
        edit.commit();
        SharedPreferences sss = getSharedPreferences("db", 0);
        Log.i("chauster", "2.set = "+sss.getStringSet("set",
                new HashSet<String>()));
    }
});
Run Code Online (Sandbox Code Playgroud)

当我先安装项目时,我点击按钮4次,logcat打印出来

1.set = []
2.set = [1]
2.set = [2, 1]
2.set = [3, 2, 1]
2.set = [3, 2, 1, 4]
Run Code Online (Sandbox Code Playgroud)

将字符串放入sharedPreference Set看起来很成功,但是当我销毁app并再次打开它时,logcat会打印出来

1.set = [1]
Run Code Online (Sandbox Code Playgroud)

它意味着在sharedPreference中只有一个字符串,我不知道发生了什么?请帮我.谢谢〜

Mr_*_*s_D 40

你陷入了编辑你从getStringSet()获得的值的通常陷阱.这在文档中是禁止

你应该 :

SharedPreferences ss = getSharedPreferences("db", 0);
Set<String> hs = ss.getStringSet("set", new HashSet<String>());
Set<String> in = new HashSet<String>(hs);
in.add(String.valueOf(hs.size()+1));
ss.edit().putStringSet("set", in).commit(); // brevity
// SharedPreferences sss = getSharedPreferences("db", 0); // not needed
Log.i("chauster", "2.set = "+ ss.getStringSet("set", new HashSet<String>()));
Run Code Online (Sandbox Code Playgroud)

对于半个出炉的解释,请参阅:尝试使用SharedPreferences存储字符串集时出现错误行为

  • 这是正确的答案 (2认同)
  • SDK设计不佳。如果有要求的话,实现应该返回一个不可变的集合(`Collections.unmodifyingSet()`)。 (2认同)

小智 8

在putStringSet之前使用edit.clear()

SharedPreferences ss = getSharedPreferences("db", 0);
Set<String> hs = ss.getStringSet("set", new HashSet<String>());
hs.add(String.valueOf(hs.size()+1));
Editor edit = ss.edit();
edit.clear();
edit.putStringSet("set", hs);
edit.commit();
Run Code Online (Sandbox Code Playgroud)

  • 这不是解决方案...... clear()删除所有首选项! (22认同)
  • 这将清除_all_首选项,而不是通过键删除 - `edit.remove('set')`.但是这可以通过从pref返回的新集创建一个新集来避免,例如`Set <String> new = new HashSet <>(ss.getStringSet('set',new HashSet <String>())); (4认同)
  • 为什么没有明确的不工作...同样的关键有问题吗? (2认同)