先看一下Google官方对于SharedPreferences的定义:
The SharedPreferences
class provides a general framework that allows you to save and retrieve persistent key-value pairs of primitive data types. You can use SharedPreferences
to save any primitive data: booleans, floats, ints, longs, and strings. This data will persist across user sessions (even if your application is killed).
SharedPreferences可以用来永久地存储数据,即使应用被销毁。事实上数据存储在Android的内部存储器上。
有两种分方法用来获取SharedPreferences对象。 getSharedPreferences() - 当应用需要多个由名字区分的存储文件时,可以调用这个方法。getPreferences()-当应用只需要一个存储文件时,调用这个方法。
在SharedPreferences对象中写入数据,需要:
1.调用edit()方法获得一个SharedPreferences.Editor对象。
2.使用Editor对象的方法比如putBoolean()和putString()等将数据写入Editor。
3.使用Editor对象的方法commit()或apply()将数据提交。
读取SharedPreferences中的数据只需要调用SharedPreferences的方法如getBoolean()和getString().
下面是一个使用SharedPreferences存储数据的例子。
public class Calc extends Activity { public static final String PREFS_NAME = "MyPrefsFile"; @Override protected void onCreate(Bundle state){ super.onCreate(state); . . . // Restore preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); boolean silent = settings.getBoolean("silentMode", false); setSilent(silent); } @Override protected void onStop(){ super.onStop(); // We need an Editor object to make preference changes. // All objects are from android.context.Context SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("silentMode", mSilentMode); // Commit the edits! editor.commit(); } }
从Google的介绍中可以看到,SharedPreferences的局限性在于只能存储基本类型:boolean,floot,short,int,long,string等。对于用户自定义的类型,通常由多个基本类型数据和数组组成。比如这样一个自定义类型:
public class Action { // Action Data private UUID id; private Date start;private String actionName; private int alarmingHour=0;private String[] records = new String[100]; }
这时候就不能使用SharedPreferences来存储。
这个时候就需要另一个主角 :JSON.
JSON的全称是JavaScript对象表示法,是存储和交换文本信息的语法,类似 XML,实现了对象与文本之间的转化。
在Android中内置了JSONObject和JSONArray.
对于这样一个用户自定义类型,可以通过
/** * transform the Action instance to JSONObject,and then save JSONObject.toString() * to SharedPreference. * @return the JSONObject corresponding to the Action * @throws JSONException */ public JSONObject toJSON() throws JSONException{ JSONObject json = new JSONObject(); json.put(JSON_id,id.toString()); json.put(JSON_startDate, start.getTime()); JSONArray array = new JSONArray(); JSONObject JSONRecords[] = new JSONObject[length]; for(int i = 0; i<length;i++){ JSONRecords[i] = new JSONObject(); JSONRecords[i].put(JSON_record, records[i].getRecord()); array.put(i,JSONRecords[i]); } json.put(JSON_dailyRecords,array); return json; } /** * get the Action from JSONObject * @param jsonString the jsonString retrieved from SharedPreference. * @return the Action stored in JSONObject * @throws JSONException */ public static Action parseJSONString(String jsonString) throws JSONException{ JSONObject json; json = new JSONObject(jsonString); UUID id = UUID.fromString(json.getString(JSON_id)); Date start = new Date(json.getLong(JSON_startDate)); String actionName = json.getString(JSON_name); String[] dailyRecords = new DailyRecord[100]; for (int i = 0; i<100;i++){ JSONObject json_record = array.getJSONObject(i); String record = json_record.getString(JSON_record); dailyRecords[i] = record; } return new Action(id,start,actionName,dailyRecords); }
来实现Action和JSONObject之间的转换,JSONObject实际是是文本的形式,可以很方便地转化为String,因此使用SharedPreferences来存储转换之后的String就可以实现Action的存储。
SharedPreferences sp =getSharedPreferences(Config.CurrentAction, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); try { editor.putString(Config.CurrentActionDetails, currentAction.toJSON().toString()); } catch (JSONException e) { e.printStackTrace(); } editor.apply();
从SharedPreferences中读取Action可以这样做:
try { SharedPreferences sp = getSharedPreferences(Config.CurrentAction, Context.MODE_PRIVATE); String jsonString = sp.getString(Config.CurrentActionDetails, ""); currentAction = Action.parseJSONString(jsonString); } catch (JSONException e) { e.printStackTrace(); }
这样就实现了用户自定义类Action的本地存储与读取。