SharedPreferences の putStringSet()メソッドの不具合

Stringのリストがうまく永続化できない!

SharedPreferences を用いて Stringのリストを保存しようと思い下記のようにした。

ところが次のような不思議な現象に遭遇した。

  • アプリの動作中は問題ない
  • アプリをいったん終了し、再度立ち上げると、一番最初に記録した値のみが再現され、その後に追加した値はなかったことになっていた

どうやら、(環境により異なるが)
/data/data/(applicationId)/shared_prefs
辺りに生成される「prefs.xml」(SharedPreferencesの実態)が最初の書き込み以降更新されていないようなのだ。
putString() とか putInt() で同じようにしたときには意図したとおりに動作するのに、なぜか putStringSet() ではそのようになる。

これはバグなのだろうか?調べてみたところJavaでも同じことが起こっているようだ。

解決策として、いくつか考えてみた。

putString()等でダミーを一緒に書き込む

これは putString() ならうまくxmlファイルの更新がかかるのでそれを利用した。冗長なデータを書き込むのであまり気分はよくない。

一旦、全てをクリアしてしまう

気分一新、全ての内容をクリアしてから再度上書きする。この場合はこれでもなんとかなってしまうのだが、このデータベースに他の情報が一緒に記録されていれば(というかその可能性は高い)目も当てられないことになる。

該当する情報だけ一旦消してから書き直す

該当情報だけ消して書き直す。一番角が立たない方法だろう。
remove() で消去したあと、apply() するのがポイント!これを忘れるとやっぱり最初の現象と同じになってしまう。