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つの文字列しかないことを意味します。何が起こったのかわかりませんか?私を助けてください。ありがとう〜
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();
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を使用して文字列セットを格納しようとしたときの誤動作
Remove
HashSet
のSharedPreferences
のキー、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>()));
}
});
}