2016-08-21 15 views
0

私のsharedPreferencesは、アプリケーションを閉じた後も保持されません。それは常に私がアプリケーションが実行される最初に追加するデフォルト4を残します。再起動後SharedPreferencesが保存されない

 static public Boolean addFavoriteItem(Integer itemId, Context c) { 
    SharedPreferences s = PreferenceManager.getDefaultSharedPreferences(c); 
    Set<String> list = new HashSet<>(); 
    list = s.getStringSet("favItems",list); 
    list.add(Integer.toString(itemId)); 
    s.edit().putStringSet("favItems",list).apply(); 
    Log.d("listNowAdd:",list.toString()); 
    return true; 
} 
static public Boolean removeFavoriteItem(Integer itemId, Context c) { 
    SharedPreferences s = PreferenceManager.getDefaultSharedPreferences(c); 
    Set<String> list = new HashSet<>(); 
    list = s.getStringSet("favItems",list); 
    list.remove(Integer.toString(itemId)); 
    s.edit().putStringSet("favItems",list).apply(); 
    Log.d("listNowRemove:",list.toString()); 
    return true; 
} 

アクティビティを再起動しても一時的に機能しますが、アプリが終了して再開されても、アイデアはありませんか?

答えて

5

あなたはStringSetdocumentedとしてSharedPreferencesによって返され、変更することはできません:あなたはは、この呼び出しによって返されたセットのインスタンスを変更してはなりません

注意を。保存したデータの一貫性は保証されません。また、インスタンスをまったく変更することもできません。

基本的に何が起こるかは、あなたがSharedPreferencesが所有Setを変更していることです。 Setがメモリに保持されているので、アプリケーションが実行中の間に「動作」します。変更を保存しようとすると、共有環境設定の実装ではequals()を使用して値が比較されますが、もちろんそのセットはそれ自体と同じであるため、実際には変更は保存されません。

新しいSet<String>を作成することができます。 HashSet<String>およびaddAll()共有設定から取得したセットをこのコピーで変更します。

関連する問題