web-dev-qa-db-ja.com

SharedPreferencesputStringSetが機能しない

SetをSharedPreferenceに入れる必要がありますが、問題があります。

ボタンをクリックすると、SharedPreferenceからSetを取得し、Setにデータを追加してから、SharedPreferenceを元に戻しますが、プロジェクトを破棄して再度開くと、sharedPreferenceはSetで1つの文字列しか取得しません。

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>()));
    }
});

最初にプロジェクトをインストールし、ボタンを4回クリックすると、logcatがプロジェクトを印刷します。

1.set = []
2.set = [1]
2.set = [2, 1]
2.set = [3, 2, 1]
2.set = [3, 2, 1, 4]

sharedPreference Setに文字列を入れるのは成功したように見えますが、アプリを破棄して再度開くと、logcatがそれを出力します

1.set = [1]

これは、sharedPreferenceのSetに1つの文字列しかないことを意味します。何が起こったのかわかりませんか?私を助けてください。ありがとう〜

13
henry4343

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();
5
user3243140

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>()));

中途半端な説明については、以下を参照してください: SharedPreferencesを使用して文字列セットを格納しようとしたときの誤動作

43
Mr_and_Mrs_D

RemoveHashSetSharedPreferencesのキー、commit次に、新しい値を追加します。

SharedPreferences ss;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_third);
    ss = getSharedPreferences("db", 0);
    fun();
}

void fun() {
    Log.i("chauster", "1.set = "+ss.getStringSet("set", new HashSet<String>()));

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

        @Override
        public void onClick(View v) {
            Set<String> hs = ss.getStringSet("set", new HashSet<String>());
            hs.add(String.valueOf(hs.size()+1));
            Log.i(TAG, "list: " + hs.toString());
            Editor edit = ss.edit();
            edit.remove("set");
            edit.commit();
            edit.putStringSet("set", hs);
            Log.i(TAG, "saved: " + edit.commit());

            Log.i("chauster", "2.set = "+ss.getStringSet("set", new HashSet<String>()));
        }
    });
}
2
Krrishnaaaa