android – Store a List or Set in SharedPreferences-ThrowExceptions

Exception or error:

My app has a list of String values (of some 5-20 characters each), that I have to store persistently. The SharedPreferences seem to me the most appropriate, as it’s a short list. Usually it will be empty, or contain just a few values.

I’ve already seen this question which asks basically the same, the answer is unsuitable as the StringSet is API level 11, and I’m targeting Android 2.1 and up, which is API 7.

Considering the usually small list of strings, using a database seems total overkill to me. Using a file to store this would be another solution but not so elegant. I’ve considered creating keys (like “1”, “2”, “3”, etc) but that’s actually worse than using a file – especially when it comes to reading back my data.

Anyway if nothing else works I’ll have to go for the file option. If my idea is simply not practical using the SharedPreferences for API lvl 7, I’d appreciate to hear that too.

How to solve:

I found the easiest solution to store and retrieve a list of items from SharedPreferences is to simply serialize / deserilaize the array into / from JSON and store it into a string setting.

Gson comes really handy doing it.

READ:

SharedPreferences prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE);
String value = prefs.getString("list", null);

GsonBuilder gsonb = new GsonBuilder();
Gson gson = gsonb.create();
MyObject[] list = gson.fromJson(value, MyObject[].class);

WRITE:

String value = gson.toJson(list);
SharedPreferences prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE);
Editor e = prefs.edit();
e.putString("list", value);
e.commit();

###

Using this object –> TinyDB–Android-Shared-Preferences-Turbo its very simple.

TinyDB tinydb = new TinyDB(context);

to put

tinydb.putList("MyUsers", mUsersArray);

to get

tinydb.getList("MyUsers");

###

If you know the order of the list entries and/or it doesn’t matter you can “glue” them all into a single String with a separator of your choice and then store it with SharedPreferences. After loading it back you would split the String into the entries based on your separator. Something like String listEntries = "enty1;entry2;entry3" (semicolon as separator in this case). But no idea about performance issues.

Leave a Reply

Your email address will not be published. Required fields are marked *