I recently coded an Android app. It's just a simple app that allows you to keep score of a basketball game with a few simple counter intervals. I'm getting demand to add a save feature, so you can save your scores and then load them back up. Currently, when you stop the app, your data is lost. So what I was wondering is what I would have to add to have the app save a label (score) and then load it back up. Thanks guys sorry I don't know much about this stuff.
-
10honestly I feel sorry the android documentation feels so difficult to go through. We all here with love – Jitin Nov 28 '20 at 22:57
12 Answers
You have two options, and I'll leave selection up to you.
Shared Preferences
This is a framework unique to Android that allows you to store primitive values (such as
int
,boolean,
andString
, although strictly speakingString
isn't a primitive) in a key-value framework. This means that you give a value a name, say, "homeScore" and store the value to this key.SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putInt("homeScore", YOUR_HOME_SCORE); // Apply the edits! editor.apply(); // Get from the SharedPreferences SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); int homeScore = settings.getInt("homeScore", 0);
Internal Storage
This, in my opinion, is what you might be looking for. You can store anything you want to a file, so this gives you more flexibility. However, the process can be trickier because everything will be stored as bytes, and that means you have to be careful to keep your read and write processes working together.
int homeScore; byte[] homeScoreBytes; homeScoreBytes[0] = (byte) homeScore; homeScoreBytes[1] = (byte) (homeScore >> 8); //you can probably skip these two homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a //basketball score above 128, it's //such a rare occurance. FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE); outputStream.write(homeScoreBytes); outputStream.close();
Now, you can also look into External Storage, but I don't recommend that in this particular case, because the external storage might not be there later. (Note that if you pick this, it requires a permission)

- 5,659
- 3
- 32
- 51
-
30LOL - I like that comment "because I've never seen a basketball score above 128" :-) btw: for your reference: http://www.nba.com/pistons/news/highest_score_071211.html – Mathias Conradt Jun 09 '12 at 16:19
-
12
-
-
I am also want to store game (5 results) to internal storage. after while am displaying scores from getting data from internal storage. any samples available? – Silambarasan Dec 15 '15 at 06:55
-
1And If I'm storing data in internal storage,will the files get deleted if I uninstall the app.? – Gladwin James Apr 25 '16 at 10:56
-
@GladwinJames Internal files are removed only if you uninstall and reinstall. An upgrade will not remove internal files **source:**`http://stackoverflow.com/questions/32231170/are-internal-storage-files-deleted-on-app-update` – Dean Meehan Mar 29 '17 at 21:14
OP is asking for a "save" function, which is more than just preserving data across executions of the program (which you must do for the app to be worth anything.)
I recommend saving the data in a file on the sdcard which allows you to not only recall it later, but allows the user to mount the device as an external drive on their own computer and grab the data for use in other places.
So you really need a multi-point system:
1) Implement onSaveInstanceState()
. In this method, you're passed a Bundle, which is basically like a dictionary. Store as much information in the bundle as would be needed to restart the app exactly where it left off. In your onCreate()
method, check for the passed-in bundle to be non-null, and if so, restore the state from the bundle.
2) Implement onPause()
. In this method, create a SharedPreferences editor and use it to save whatever state you need to start the app up next time. This mainly consists of the users' preferences (hence the name), but anything else relavent to the app's start-up state should go here as well. I would not store scores here, just the stuff you need to restart the app. Then, in onCreate()
, whenever there's no bundle object, use the SharedPreferences interface to recall those settings.
3a) As for things like scores, you could follow Mathias's advice above and store the scores in the directory returned in getFilesDir()
, using openFileOutput()
, etc. I think this directory is private to the app and lives in main storage, meaning that other apps and the user would not be able to access the data. If that's ok with you, then this is probably the way to go.
3b) If you do want other apps or the user to have direct access to the data, or if the data is going to be very large, then the sdcard is the way to go. Pick a directory name like com/user1446371/basketballapp/ to avoid collisions with other applications (unless you're sure that your app name is reasonably unique) and create that directory on the sdcard. As Mathias pointed out, you should first confirm that the sdcard is mounted.
File sdcard = Environment.getExternalStorageDirectory();
if( sdcard == null || !sdcard.isDirectory()) {
fail("sdcard not available");
}
File datadir = new File(sdcard, "com/user1446371/basketballapp/");
if( !datadir.exists() && !datadir.mkdirs() ) {
fail("unable to create data directory");
}
if( !datadir.isDirectory() ) {
fail("exists, but is not a directory");
}
// Now use regular java I/O to read and write files to data directory
I recommend simple CSV files for your data, so that other applications can read them easily.
Obviously, you'll have to write activities that allow "save" and "open" dialogs. I generally just make calls to the openintents file manager and let it do the work. This requires that your users install the openintents file manager to make use of these features, however.

- 9,991
- 11
- 77
- 112
-
One more comment: if at all possible, do the reading and writing in a different thread, especially the writing. Otherwise, your app freezes up and the user has a less-than-optimal experience. – Edward Falk Apr 25 '15 at 22:04
-
Just one comment: I wrote this answer nine years ago, and I believe some of these methods are deprecated. Take this answer as a rough guide only. – Edward Falk Nov 27 '21 at 03:42
In onCreate:
SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);
String mySetting = sharedPref.getString("mySetting", null);
In onDestroy or equivalent:
SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("mySetting", "Hello Android");
editor.commit();

- 1,894
- 21
- 25
Use SharedPreferences, http://developer.android.com/reference/android/content/SharedPreferences.html
Here's a sample: http://developer.android.com/guide/topics/data/data-storage.html#pref
If the data structure is more complex or the data is large, use an Sqlite database; but for small amount of data and with a very simple data structure, I'd say, SharedPrefs will do and a DB might be overhead.

- 28,420
- 21
- 138
- 192
-
That's right. Using something more complex than this is just overkill and a dumb idea. SharedPreferences is all that is needed. – Kristopher Micinski Jun 09 '12 at 16:23
There is a lot of options to store your data and Android offers you to chose anyone Your data storage options are the following:
Shared Preferences Store private primitive data in key-value pairs. Internal Storage Store private data on the device memory. External Storage Store public data on the shared external storage. SQLite Databases Store structured data in a private database. Network Connection Store data on the web with your own network server
Check here for examples and tuto

- 5,349
- 6
- 29
- 60
2021 Answer
Old question but in 2021 you can use several things to save data.
1. Using local database - Room Library
Room is a library that let you store data in the internal SqlLite database that come with your Android device, it's a local database. It's easy and really powerful.
https://developer.android.com/training/data-storage/room
2. Using a remote database - Firebase / Your own database implementation
You can use Firebase services or your own database implementation on your server to remote store your data, that way you could access the data throw multiple devices.
https://firebase.google.com/docs/firestore
3. Storing a local file
You can store all information in a local file saved in the device's external storage, using maybe a .txt file with a \n as data separator. That option looks really "caveman" in 2021.
https://stackoverflow.com/a/14377185/14327871
4. Using SharedPreferences
As many people pointed you can also use the sharedPreferences to store little information as pair of key - value, it's useful for example when saving user preferences across a session.
https://developer.android.com/training/data-storage/shared-preferences?hl=en
For the OP case I would suggest using the 1st or 2nd option.

- 1,345
- 2
- 10
- 21
Shared preferences: android shared preferences example for high scores?
Does your application has an access to the "external Storage Media". If it does then you can simply write the value (store it with timestamp) in a file and save it. The timestamp will help you in showing progress if thats what you are looking for. {not a smart solution.}
-
2regarding 2) no need to use the external storage, which always requires a check (whether an sdcard is mounted). Why not just use the cache or file dir of the app? (getFilesDir(), getCacheDir()). – Mathias Conradt Jun 09 '12 at 15:58
-
-
@thomasfedb I already posted the very first reply to this question, and with the links and linked sample, it should be all he needs. Anything I missed? – Mathias Conradt Jun 10 '12 at 10:15
You can store your scores and load them back easily! by using this method Use this library Paper Db
Add this library on your app:
implementation 'io.github.pilgr:paperdb:2.7.1'
and then initialize it once in the activity onCreate() you are storing:
Paper.init(context)
create a key to store your scores
int myScore=10;
Paper.book().write("scores", myScore);
and get the value of the score :
int mySavedScores=Paper.book().read("scores");
that's It!!! now you can save and access the value even application is closed and refer the documentation for more methods and information, it's a Good habit to read the documentation.

- 439
- 4
- 8
Please don't forget one thing - Internal Storage data are deleted when you uninstall the app. In some cases it can be "unexpected feature". Then it's good to use external storage.
Google docs about storage - Please look in particular at getExternalStoragePublicDirectory

- 1,133
- 2
- 17
- 44
Quick answer:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Boolean Music;
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//restore preferences
SharedPreferences settings = this.getSharedPreferences(PREFS_NAME, 0);
Music = settings.getBoolean("key", true);
}
@Override
public void onClick() {
//save music setup to system
SharedPreferences settings = this.getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("key", Music);
editor.apply();
}
}

- 361
- 6
- 11
In my opinion db4o is the easiest way to go. Here you can find a tutorial: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/
And here you can download the library:
http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip
(Just put the db4o-8.0...-all-java5.jar in the lib directory into your project's libs folder. If there is no libs folder in you project create it)
As db4o is a object oriented database system you can directly save you objects into the database and later get them back.

- 2,397
- 21
- 21
-
1db4o looks like a bit of overhead to me. If at all, an sqlite db would probably be easier due to the support that Android brings with it, however for a small amount of very basic data, I'd say, SharedPrefs would be sufficient. – Mathias Conradt Jun 09 '12 at 15:56
-
In my opinion db4o is a lot easier than sql especially for beginners. And less fiddling than with this ugly shared prefs :-) – fivef Jun 09 '12 at 16:12
-
a bit off-topic - but...: I've looked into db4o long time ago, for non-Android projects, and the idea isn't bad; what I don't like about db4o is that it's proprietary. If you want to avoid dealing with sql directly, I can also recommend ORMLite as a ORM library (ORM = object-relational-mapping). Nevertheless, I guess db4o would also work well for such task, no doubt. – Mathias Conradt Jun 09 '12 at 16:16
use this methods to use sharedPreferences very easily.
private val sharedPreferences = context.getSharedPreferences("myPreferences", Context.MODE_PRIVATE)
fun put(key: String, value: String) = sharedPreferences.edit().putString(key, value).apply()
fun put(key: String, value: Int) = sharedPreferences.edit().putInt(key, value).apply()
fun put(key: String, value: Float) = sharedPreferences.edit().putFloat(key, value).apply()
fun put(key: String, value: Boolean) = sharedPreferences.edit().putBoolean(key, value).apply()
fun put(key: String, value: Long) = sharedPreferences.edit().putLong(key, value).apply()
fun getString(key: String, defaultValue: String? = null): String? = sharedPreferences.getString(key, defaultValue)
fun getInt(key: String, defaultValue: Int = -1): Int = sharedPreferences.getInt(key, defaultValue)
fun getFloat(key: String, defaultValue: Float = -1F): Float = sharedPreferences.getFloat(key, defaultValue)
fun getBoolean(key: String, defaultValue: Boolean = false): Boolean = sharedPreferences.getBoolean(key, defaultValue)
fun getLong(key: String, defaultValue: Long = -1L): Long = sharedPreferences.getLong(key, defaultValue)
fun clearAll() = sharedPreferences.edit().clear().apply()
put them in a class and get context in its constructor.

- 6,742
- 5
- 28
- 56