Best Practice: SharedPreferences

Best Practice: SharedPreferences - Lemberg Solutions Blog

Android provides many ways of storing application data. One of these ways leads us to the SharedPreferences object which is used to store private primitive data in key-value pairs.

All logic is based on three simple classes only:

SharedPreferences

SharedPreferences is main of them. It's responsible for getting (parsing) stored data, provides interface for getting Editor object and interfaces for adding and removing OnSharedPreferenceChangeListener

  • To create SharedPreferences you will need Context object (can be an application Context)
  • getSharedPreferences method parses Preference file and creates Map object for it
  • You can create it in few modes provided by Context, it's strongly recommended to use MODE_PRIVATE because creating world-readable/writable files is very dangerous, and likely to cause security holes in applications

Editor

SharedPreferences.Editor is an Interface used for modifying values in a SharedPreferences object. All changes you make in an editor are batched, and not copied back to the original SharedPreferences until you call commit() or apply()

  • Use simple interface to put values in Editor
  • Save values synchronous with commit() or asynchronous with apply which is faster. In fact of using different threads using commit() is safer. Thats why I prefer to use commit().
  • Remove single value with remove() or clear all values with clear()

Performance & Tips

  • SharedPreferences is a Singleton object so you can easily get as many references as you want, it opens file only when you call getSharedPreferences first time, or create only one reference for it.
  • As SharedPreferences is a Singleton object you can change any of It's instances and not be scared that their data will be different
  • When you call get method first time it parses value by key and adds this value to the map. So for second call it just gets it from map, without parsing.
  • Remember the larger the Preference object is the longer get, commit, apply, remove and clear operations will be. So it's highly recommended to separate your data in different small objects.
  • Your Preferences will not be removed after Application update. So there are cases when you need to create some migration scheme. For example you have Application that parse local JSON in start of application, to do this only after first start you decided to save boolean flag wasLocalDataLoaded. After some time you updated that JSON and released new application version. Users will update their applications but they will not load new JSON because they already done it in first application version.
  • SharedPreferences are stored in an xml file in the app data folder

Android guide.

Sample Code