In this tutorial we’ll use Shared Preferences in our android application to store data in the form of key-value pair.
Android Shared Preferences Overview
Shared Preferences allows activities and applications to keep preferences, in the form of key-value pairs similar to a Map that will persist even when the user closes the application.
Android stores Shared Preferences settings as XML file in shared_prefs folder under DATA/data/{application package} directory. The DATA folder can be obtained by callingEnvironment.getDataDirectory()
.
SharedPreferences is application specific, i.e. the data is lost on performing one of the following options:
- on uninstalling the application
- on clearing the application data (through Settings)
As the name suggests, the primary purpose is to store user-specified configuration details, such as user specific settings, keeping the user logged into the application.
To get access to the preferences, we have three APIs to choose from:
- getPreferences() : used from within your Activity, to access activity-specific preferences
- getSharedPreferences() : used from within your Activity (or other application Context), to access application-level preferences
- getDefaultSharedPreferences() : used on the PreferenceManager, to get the shared preferences that work in concert with Android’s overall preference framework
In this tutorial we’ll go with getSharedPreferences()
. The method is defined as follows:
getSharedPreferences (String PREFS_NAME, int mode)
PREFS_NAME is the name of the file.
mode is the operating mode.
Following are the operating modes applicable:
- MODE_PRIVATE: the default mode, where the created file can only be accessed by the calling application
- MODE_WORLD_READABLE: Creating world-readable files is very dangerous, and likely to cause security holes in applications
- MODE_WORLD_WRITEABLE: Creating world-writable files is very dangerous, and likely to cause security holes in applications
- MODE_MULTI_PROCESS: This method will check for modification of preferences even if the Shared Preference instance has already been loaded
- MODE_APPEND: This will append the new preferences with the already existing preferences
- MODE_ENABLE_WRITE_AHEAD_LOGGING: Database open flag. When it is set, it would enable write ahead logging by default
Shared Preferences allows activities and applications to keep preferences, in the form of key-value pairs similar to a Map that will persist even when the user closes the application.
Android stores Shared Preferences settings as XML file in shared_prefs folder under DATA/data/{application package} directory. The DATA folder can be obtained by calling
Environment.getDataDirectory()
.
SharedPreferences is application specific, i.e. the data is lost on performing one of the following options:
- on uninstalling the application
- on clearing the application data (through Settings)
As the name suggests, the primary purpose is to store user-specified configuration details, such as user specific settings, keeping the user logged into the application.
To get access to the preferences, we have three APIs to choose from:
- getPreferences() : used from within your Activity, to access activity-specific preferences
- getSharedPreferences() : used from within your Activity (or other application Context), to access application-level preferences
- getDefaultSharedPreferences() : used on the PreferenceManager, to get the shared preferences that work in concert with Android’s overall preference framework
In this tutorial we’ll go with
getSharedPreferences()
. The method is defined as follows:getSharedPreferences (String PREFS_NAME, int mode)
PREFS_NAME is the name of the file.
mode is the operating mode.
mode is the operating mode.
Following are the operating modes applicable:
- MODE_PRIVATE: the default mode, where the created file can only be accessed by the calling application
- MODE_WORLD_READABLE: Creating world-readable files is very dangerous, and likely to cause security holes in applications
- MODE_WORLD_WRITEABLE: Creating world-writable files is very dangerous, and likely to cause security holes in applications
- MODE_MULTI_PROCESS: This method will check for modification of preferences even if the Shared Preference instance has already been loaded
- MODE_APPEND: This will append the new preferences with the already existing preferences
- MODE_ENABLE_WRITE_AHEAD_LOGGING: Database open flag. When it is set, it would enable write ahead logging by default
Initialization
We need an editor to edit and save the changes in shared preferences. The following code can be used to get the shared preferences.
1
2
SharedPreferences pref = getApplicationContext().getSharedPreferences(
"MyPref"
,
0
);
// 0 - for private mode
Editor editor = pref.edit();
We need an editor to edit and save the changes in shared preferences. The following code can be used to get the shared preferences.
1
2
| SharedPreferences pref = getApplicationContext().getSharedPreferences( "MyPref" , 0 ); // 0 - for private mode Editor editor = pref.edit(); |
Storing Data
editor.commit() is used in order to save changes to shared preferences.
1
2
3
4
5
6
7
editor.putBoolean(
"key_name"
,
true
);
// Storing boolean - true/false
editor.putString(
"key_name"
,
"string value"
);
// Storing string
editor.putInt(
"key_name"
,
"int value"
);
// Storing integer
editor.putFloat(
"key_name"
,
"float value"
);
// Storing float
editor.putLong(
"key_name"
,
"long value"
);
// Storing long
editor.commit();
// commit changes
editor.commit() is used in order to save changes to shared preferences.
1
2
3
4
5
6
7
| editor.putBoolean( "key_name" , true ); // Storing boolean - true/false editor.putString( "key_name" , "string value" ); // Storing string editor.putInt( "key_name" , "int value" ); // Storing integer editor.putFloat( "key_name" , "float value" ); // Storing float editor.putLong( "key_name" , "long value" ); // Storing long editor.commit(); // commit changes |
Retrieving Data
Data can be retrieved from saved preferences by calling getString() as follows:
1
2
3
4
5
pref.getString(
"key_name"
,
null
);
// getting String
pref.getInt(
"key_name"
,
null
);
// getting Integer
pref.getFloat(
"key_name"
,
null
);
// getting Float
pref.getLong(
"key_name"
,
null
);
// getting Long
pref.getBoolean(
"key_name"
,
null
);
// getting boolean
Data can be retrieved from saved preferences by calling getString() as follows:
1
2
3
4
5
| pref.getString( "key_name" , null ); // getting String pref.getInt( "key_name" , null ); // getting Integer pref.getFloat( "key_name" , null ); // getting Float pref.getLong( "key_name" , null ); // getting Long pref.getBoolean( "key_name" , null ); // getting boolean |
Clearing or Deleting Data
remove(“key_name”) is used to delete that particular value.
clear() is used to remove all data
1
2
3
4
editor.remove(
"name"
);
// will delete key name
editor.remove(
"email"
);
// will delete key email
editor.commit();
// commit changes
1
2
editor.clear();
editor.commit();
// commit changes
remove(“key_name”) is used to delete that particular value.
clear() is used to remove all data
1
2
3
4
| editor.remove( "name" ); // will delete key name editor.remove( "email" ); // will delete key email editor.commit(); // commit changes |
1
2
| editor.clear(); editor.commit(); // commit changes |
Android Shared Preferences Project Code
The activity_main.xml
layout consists of two EditText views which store and display name and email. The three buttons implement their respective onClicks in the MainActivity
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<
RelativeLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:paddingBottom
=
"@dimen/activity_vertical_margin"
android:paddingLeft
=
"@dimen/activity_horizontal_margin"
android:paddingRight
=
"@dimen/activity_horizontal_margin"
android:paddingTop
=
"@dimen/activity_vertical_margin"
>
<
Button
android:id
=
"@+id/btnSave"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_centerVertical
=
"true"
android:layout_alignParentLeft
=
"true"
android:layout_alignParentStart
=
"true"
android:onClick
=
"Save"
android:text
=
"Save"
/>
<
Button
android:id
=
"@+id/btnRetr"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_centerHorizontal
=
"true"
android:layout_centerVertical
=
"true"
android:onClick
=
"Get"
android:text
=
"Retrieve"
/>
<
Button
android:id
=
"@+id/btnClear"
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
android:layout_alignRight
=
"@+id/etEmail"
android:layout_centerVertical
=
"true"
android:layout_alignParentRight
=
"true"
android:layout_alignParentEnd
=
"true"
android:onClick
=
"clear"
android:text
=
"Clear"
/>
<
EditText
android:id
=
"@+id/etEmail"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:ems
=
"10"
android:hint
=
"Email"
android:inputType
=
"textEmailAddress"
android:layout_below
=
"@+id/etName"
android:layout_marginTop
=
"20dp"
android:layout_alignParentRight
=
"true"
android:layout_alignParentEnd
=
"true"
/>
<
EditText
android:id
=
"@+id/etName"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:ems
=
"10"
android:hint
=
"Name"
android:inputType
=
"text"
android:layout_alignParentTop
=
"true"
android:layout_alignLeft
=
"@+id/etEmail"
android:layout_alignStart
=
"@+id/etEmail"
/>
</
RelativeLayout
>
The MainActivity.java
file is used to save and retrieve the data through keys.
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package
com.journaldev.sharedpreferences;
import
android.app.Activity;
import
android.content.Context;
import
android.content.SharedPreferences;
import
android.os.Bundle;
import
android.view.Menu;
import
android.view.View;
import
android.widget.TextView;
public
class
MainActivity
extends
Activity {
SharedPreferences sharedpreferences;
TextView name;
TextView email;
public
static
final
String mypreference =
"mypref"
;
public
static
final
String Name =
"nameKey"
;
public
static
final
String Email =
"emailKey"
;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (TextView) findViewById(R.id.etName);
email = (TextView) findViewById(R.id.etEmail);
sharedpreferences = getSharedPreferences(mypreference,
Context.MODE_PRIVATE);
if
(sharedpreferences.contains(Name)) {
name.setText(sharedpreferences.getString(Name,
""
));
}
if
(sharedpreferences.contains(Email)) {
email.setText(sharedpreferences.getString(Email,
""
));
}
}
public
void
Save(View view) {
String n = name.getText().toString();
String e = email.getText().toString();
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Name, n);
editor.putString(Email, e);
editor.commit();
}
public
void
clear(View view) {
name = (TextView) findViewById(R.id.etName);
email = (TextView) findViewById(R.id.etEmail);
name.setText(
""
);
email.setText(
""
);
}
public
void
Get(View view) {
name = (TextView) findViewById(R.id.etName);
email = (TextView) findViewById(R.id.etEmail);
sharedpreferences = getSharedPreferences(mypreference,
Context.MODE_PRIVATE);
if
(sharedpreferences.contains(Name)) {
name.setText(sharedpreferences.getString(Name,
""
));
}
if
(sharedpreferences.contains(Email)) {
email.setText(sharedpreferences.getString(Email,
""
));
}
}
@Override
public
boolean
onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return
true
;
}
}
mypreference is the name of the file where the shared preferences key-value pair is stored.
The image below shows the final output of our project:
This brings an end to this tutorial
The
activity_main.xml
layout consists of two EditText views which store and display name and email. The three buttons implement their respective onClicks in the MainActivity
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" android:paddingBottom = "@dimen/activity_vertical_margin" android:paddingLeft = "@dimen/activity_horizontal_margin" android:paddingRight = "@dimen/activity_horizontal_margin" android:paddingTop = "@dimen/activity_vertical_margin" > < Button android:id = "@+id/btnSave" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_centerVertical = "true" android:layout_alignParentLeft = "true" android:layout_alignParentStart = "true" android:onClick = "Save" android:text = "Save" /> < Button android:id = "@+id/btnRetr" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_centerHorizontal = "true" android:layout_centerVertical = "true" android:onClick = "Get" android:text = "Retrieve" /> < Button android:id = "@+id/btnClear" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignRight = "@+id/etEmail" android:layout_centerVertical = "true" android:layout_alignParentRight = "true" android:layout_alignParentEnd = "true" android:onClick = "clear" android:text = "Clear" /> < EditText android:id = "@+id/etEmail" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:ems = "10" android:hint = "Email" android:inputType = "textEmailAddress" android:layout_below = "@+id/etName" android:layout_marginTop = "20dp" android:layout_alignParentRight = "true" android:layout_alignParentEnd = "true" /> < EditText android:id = "@+id/etName" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:ems = "10" android:hint = "Name" android:inputType = "text" android:layout_alignParentTop = "true" android:layout_alignLeft = "@+id/etEmail" android:layout_alignStart = "@+id/etEmail" /> </ RelativeLayout > |
The
MainActivity.java
file is used to save and retrieve the data through keys.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
| package com.journaldev.sharedpreferences; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { SharedPreferences sharedpreferences; TextView name; TextView email; public static final String mypreference = "mypref" ; public static final String Name = "nameKey" ; public static final String Email = "emailKey" ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); name = (TextView) findViewById(R.id.etName); email = (TextView) findViewById(R.id.etEmail); sharedpreferences = getSharedPreferences(mypreference, Context.MODE_PRIVATE); if (sharedpreferences.contains(Name)) { name.setText(sharedpreferences.getString(Name, "" )); } if (sharedpreferences.contains(Email)) { email.setText(sharedpreferences.getString(Email, "" )); } } public void Save(View view) { String n = name.getText().toString(); String e = email.getText().toString(); SharedPreferences.Editor editor = sharedpreferences.edit(); editor.putString(Name, n); editor.putString(Email, e); editor.commit(); } public void clear(View view) { name = (TextView) findViewById(R.id.etName); email = (TextView) findViewById(R.id.etEmail); name.setText( "" ); email.setText( "" ); } public void Get(View view) { name = (TextView) findViewById(R.id.etName); email = (TextView) findViewById(R.id.etEmail); sharedpreferences = getSharedPreferences(mypreference, Context.MODE_PRIVATE); if (sharedpreferences.contains(Name)) { name.setText(sharedpreferences.getString(Name, "" )); } if (sharedpreferences.contains(Email)) { email.setText(sharedpreferences.getString(Email, "" )); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true ; } } |
mypreference is the name of the file where the shared preferences key-value pair is stored.
The image below shows the final output of our project:
This brings an end to this tutorial