Android SharedPreferences update does not work

我怕爱的太早我们不能终老 提交于 2019-12-29 08:42:07

问题


I know, this issue has been dealt with in many threads, but I cannot figure out this one. So I set a shared preference like this:

SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putStringSet(spinnerName, myValueSet  );
editor.apply();

I read the preferences like this:

SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
Set<String> spinnerValuesSet = null;
spinnerValuesSet = prefs.getStringSet(spinnerName,null );

Everything works, except for my changes are visible while this activity runs i.e. - I display the values from the SharedPreferences, allow the user to delete or add and then update the ListView. This works, but after I restart the application, I get the initial values. This for example is my method to delete one value from the list, update the values in SharedPreferences and update the ListView

Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View arg0) {
    SharedPreferences prefs =  MainActivity.this.getPreferences(MODE_PRIVATE);
    Set<String> spinnerValuesSet = prefs.getStringSet(spinnerName,null );
    for (String s : spinnerValuesSet)
    {
         if(s == currentSelectedItemString)
         {
             spinnerValuesSet.remove(s);
             SharedPreferences.Editor editor = prefs.edit();
             editor.putStringSet(spinnerName, spinnerValuesSet );
                 editor.apply();
             break;
         }
    }
 updateListValues();

}
});

And this is the method that updates the ListView:

 private void updateListValues()
 {
   SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
   Set<String> spinnerValuesSet = prefs.getStringSet(spinnerName,null );
   if(spinnerValuesSet.size() > 0) 
    {
        names = new ArrayList<String>();
        names.clear();
        int k=0;
        for (String s : spinnerValuesSet) {
             names.add(k, s);
             k++;
        }
        namesAA = new ArrayAdapter<String> (  this, android.R.layout.simple_list_item_activated_1, names );
        myList.setAdapter(namesAA);
   }

}

Any help is much appreciated.


回答1:


The Objects returned by the various get methods of SharedPreferences should be treated as immutable. See SharedPreferences Class Overview for reference.

You must call remove(String) through the SharedPreferences.Editor returned by SharedPreferences.edit() rather than directly on the Set returned by SharedPreferences.getStringSet(String, Set<String>).

You will need to construct a new Set of Strings containing the updated content each time since you have to remove the Set entry from SharedPreferences when you want to update its content.




回答2:


Problem happens because the Set returned by SharedPreference is immutable. https://code.google.com/p/android/issues/detail?id=27801

I solved this by created a new instance of Set and storing in all the values returned from SharedPreferences.

     //Set<String> address_ids = ids from Shared Preferences...

  //Create a new instance and store everything there.
        Set<String> all_address_ids = new HashSet<String>();
        all_address_ids.addAll(address_ids);

Now use the new instance to push the update back to SharedPreferences




回答3:


I may be wrong but I think the way you are retrieving the Shared Preferences is the problem. Try using

SharedPreferences prefs = getSharedPreferences("appPreferenceKey", Context.Mode_Private);




回答4:


Use editor.commit(); instead of editor.apply();

Example Code:

SharedPreferences prefs = MainActivity.this.getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putStringSet(spinnerName, myValueSet  );
editor.commit();


I hope this helps.




回答5:


Depending on the OS Build you may have to save values in a different way.

boolean apply = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD;

public static void saveValue(SharedPreferences.Editor editor)
{
    if(apply) {
        editor.apply();
    } else {
        editor.commit();
    }
}


来源:https://stackoverflow.com/questions/18793903/android-sharedpreferences-update-does-not-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!