Introduction to SharedPreferences
SharedPreferences is an Android mechanism for saving key-value pairs of primitive data. It’s a lightweight alternative to using databases for simple data persistence needs. This tutorial will guide you through the process of storing, retrieving, and editing data using SharedPreferences. It’s ideal for storing user preferences, application settings, or small amounts of data that need to persist between application sessions.
Core Concepts
SharedPreferences works by storing data in a private XML file within your application’s internal storage. This means the data is only accessible to your application. Data is accessed through a SharedPreferences
object, which acts as an interface to the underlying storage.
Getting Started
There are two primary ways to obtain a SharedPreferences
object:
-
Using
getSharedPreferences()
: This method allows you to specify a filename for your preference file and a mode. TheMODE_PRIVATE
mode ensures that only your application can access the file.SharedPreferences preferences = getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
-
Using
PreferenceManager.getDefaultSharedPreferences()
: This method retrieves the default SharedPreferences object for your application, which is associated with your application’s package name.SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
Storing Data
To store data, you’ll first need to obtain an Editor
object from the SharedPreferences
instance. The Editor
interface provides methods for putting different data types into the SharedPreferences.
Here’s how to store different types of data:
-
String:
SharedPreferences.Editor editor = preferences.edit(); editor.putString("name", "John Doe"); editor.apply(); // or editor.commit() - explained later
-
Integer:
editor.putInt("age", 30); editor.apply();
-
Boolean:
editor.putBoolean("isLoggedIn", true); editor.apply();
-
Long:
editor.putLong("timestamp", System.currentTimeMillis()); editor.apply();
-
Float:
editor.putFloat("pi", 3.14f); editor.apply();
-
Double:
editor.putDouble("e", 2.718); editor.apply();
Important: Applying vs. Committing Changes
After making changes with the Editor
, you need to either apply()
or commit()
them.
commit()
: This method writes the changes synchronously and returnstrue
if the write was successful, orfalse
if it failed. This can block the main thread if the write operation takes a long time.apply()
: This method writes the changes asynchronously. It doesn’t return a value, and it’s generally recommended overcommit()
because it doesn’t block the main thread. The changes are applied in a background thread.
Retrieving Data
To retrieve data from SharedPreferences, use the corresponding get
methods on the SharedPreferences
object. It’s crucial to provide a default value in case the key doesn’t exist.
-
String:
String name = preferences.getString("name", "Unknown");
-
Integer:
int age = preferences.getInt("age", 0);
-
Boolean:
boolean isLoggedIn = preferences.getBoolean("isLoggedIn", false);
-
Long:
long timestamp = preferences.getLong("timestamp", 0);
-
Float:
float pi = preferences.getFloat("pi", 0.0f);
-
Double:
double e = preferences.getDouble("e", 0.0);
Editing Existing Data
To modify existing data, you first obtain an Editor
object, make the necessary changes using the put
methods, and then apply()
or commit()
the changes.
SharedPreferences.Editor editor = preferences.edit();
editor.putString("name", "Jane Doe"); // Update the name
editor.apply();
Clearing Data
You can clear all data from the SharedPreferences file using the clear()
method on the Editor
object.
SharedPreferences.Editor editor = preferences.edit();
editor.clear();
editor.apply();
Best Practices
- Use Descriptive Keys: Choose keys that clearly indicate the purpose of the data they store.
- Provide Default Values: Always provide default values when retrieving data to avoid unexpected behavior.
- Consider Asynchronous Operations: Use
apply()
for non-critical data persistence to avoid blocking the main thread. - Use a Singleton: For ease of access across your application, consider creating a Singleton class to manage your SharedPreferences object.
- Avoid Storing Sensitive Data: SharedPreferences is not a secure storage mechanism. Do not store sensitive data like passwords or API keys in SharedPreferences. Consider using more secure methods like the Android Keystore.