2013年2月25日月曜日

SharedPreferencesのgetStringSetを使う場合の注意

SharedPreferencesはAPI11からSetを保存できるようになりましたが、こういうことをすると、一見上手くいっているようで上手く保存できなくなります。

/**
 * @return 保存したコレクション
 */
public Set getStringSet(){
 return sp.getStringSet(KEY, new HashSet());
}

/**
 * @param str 追加または削除する文字列
 * @return 保存に成功すればtrueを返す
 */
public boolean updateStringSet(String str){
 Set set = getStringSet();
 if(set.contains(str)){
  set.remove(str);
 } else {
  set.add(str);
 }

 return sp.edit().putStringSet(KEY, set).commit();
}

一見うまく動くんですが、プロセスが殺された後再度起動すると、前の値が保存されていません。しょぼーん。

色々試してみましたが、getStringSetのところでディープコピーすると正常に動作しました。

/**
 * @return 保存したコレクション
 */
public Set getStringSet(){
 Set saved =  sp.getStringSet(KEY, new HashSet());
 HashSet returnSet = new HashSet(saved.size());
 for (String str : saved) {
  returnSet.add(str);
 }
 return returnSet;
}

あんまりスマートではないけど、まあ解決したのでおっけー。

0 件のコメント:

コメントを投稿