1. ホーム
  2. android

SharedPreferencesを使用して文字列セットを保存しようとしたときの誤動作

2023-10-11 01:42:15

質問

私は、文字列のセットを SharedPreferences API .

Set<String> s = sharedPrefs.getStringSet("key", new HashSet<String>());
s.add(new_element);

SharedPreferences.Editor editor = sharedPrefs.edit();
editor.putStringSet(s);
edit.commit()

最初に上のコードを実行すると s はデフォルトの値に設定されます (作成されたばかりの空の末尾の HashSet に設定され、問題なく保存されます。

このコードを2回目、3回目に実行したときは s オブジェクトが返され、最初の要素が追加されます。要素を追加することができ、プログラムの実行中に、どうやらその要素が SharedPreferences に格納されるが、プログラムが終了すると SharedPreferences はその永続的なストレージから再び読み込まれ、新しい値は失われます。

2番目、そしてそれ以降の要素はどのように保存すれば失われないのでしょうか?

どのように解決するのですか?

この問題は、以下のサイトで説明されています。 SharedPreferences.getStringSet .

SharedPreferences.getStringSet は、保存されたHashSetオブジェクトの参照を返します。 の内部で SharedPreferences . このオブジェクトに要素を追加すると、実際には SharedPreferences .

それはいいのですが、問題は保存しようとしたときです。Android は、保存しようとしている変更された HashSet を SharedPreferences.Editor.putStringSet を使って保存しようとしている変更後のハッシュセットと SharedPreference に格納された現在のものと、両方が同じオブジェクトです!!!

可能な解決策は、コピーされた Set<String> が返す SharedPreferences オブジェクトによって返されます。

Set<String> s = new HashSet<String>(sharedPrefs.getStringSet("key", new HashSet<String>()));

これは s に追加された文字列は別のオブジェクトとなり s の中に格納されているセットには追加されません。 SharedPreferences .

他にうまくいく回避策は、同じように SharedPreferences.Editor トランザクションを使用して、より単純なプリファレンス (整数やブール値など) を保存することです。必要なことは、保存された値がトランザクションごとに異なることを強制することだけです (たとえば、文字列のセットサイズを保存することができます)。