日常開發中我們常常要用到儲存資料,Android中常用的存儲方式有SQLite,sharedPreferences 等,當然也有各自的應用場景,前者适用于儲存較多資料的情形,後者責傾向于儲存使用者偏好設定比如某個checkbox的選擇狀态,使用者登入的狀态等等,都是以鍵值對的形式進行的檔案讀取,可以存儲String,int,booean等一些基本資料類型等等。
但是每存儲一個資料都要提供一個key,如果要存儲多個資料那豈不是要寫多個key?例如我們要儲存一個使用者的登入資訊,比如使用者昵稱,個性簽名,登入時間………尼瑪我一條資料寫一個的話我都可以玩一盤撸啊撸了~反正我是受不了~那麼我們能否将使用者資訊封裝起來,統一以一個key來儲存呢?答案是肯定可以的~
java類庫中提供的位元組輸入輸出流可以輕松幫我們完成任意類型到String的可逆轉換,繼而我們就可以儲存到Share中了~
下面看代碼:
/**
* 存放實體類以及任意類型
* @param context 上下文對象
* @param key
* @param obj
*/
public static void putBean(Context context, String key, Object obj) {
if (obj instanceof Serializable) {// obj必須實作Serializable接口,否則會出問題
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
String string64 = new String(Base64.encode(baos.toByteArray(),
));
Editor editor = getSharedPreferences(context).edit();
editor.putString(key, string64).commit();
} catch (IOException e) {
e.printStackTrace();
}
} else {
throw new IllegalArgumentException(
"the obj must implement Serializble");
}
}
public static Object getBean(Context context, String key) {
Object obj = null;
try {
String base64 = getSharedPreferences(context).getString(key, "");
if (base64.equals("")) {
return null;
}
byte[] base64Bytes = Base64.decode(base64.getBytes(), );
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
obj = ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return obj;
我在公司的項目中解析json資料使用了fastJson,是通過映射關系來解析json并且可以直接将json和實體類封裝好,我稍微看了一下,fastjson也可以幫我們實作對實體類的儲存,下面看以下方法:
public static void seveBeanByFastJson(Context context, String key,
Object obj) {
Editor editor = getSharedPreferences(context).edit();
String objString = JSON.toJSONString(obj);// fastjson的方法,需要導包的
editor.putString(key, objString).commit();
}
/**
*
* @param context
* @param key
* @param clazz
* 這裡傳入一個類就是我們所需要的實體類(obj)
* @return 傳回我們封裝好的該實體類(obj)
*/
public static <T> T getBeanByFastJson(Context context, String key,
Class<T> clazz) {
String objString = getSharedPreferences(context).getString(key, "");
return JSON.parseObject(objString, clazz);
}
如果項目中導入了fastjson,可以亦可以使用上述方法儲存實體類以及任意類型~:
下面我們來測試一下:
我随意寫個實體類,并加個測試方法:
import java.io.Serializable;
public class Human implements Serializable {
/**
* 人實體類
*/
private static final long serialVersionUID = L;
private String name;
private int age;
private boolean isMarried;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarried() {
return isMarried;
}
public void setMarried(boolean isMarried) {
this.isMarried = isMarried;
}
}
随便寫個測試方法,簡便起見哈~
private Human initDataBean() {
Human human = new Human();
human.setAge();
human.setName("蘿莉");
human.setMarried(false);
return human;
}
private Human initDataBean2() {
Human human = new Human();
human.setAge();
human.setName("禦姐");
human.setMarried(true);
return human;
}
下面我們來看看測試效果~:
總結,上述兩種方法都可以幫我們存儲和讀取任意類型的資料,與SharePreferencs結合起來使用還是很友善的,但是不要存儲bimap等這一類比較大的資料類型,因為share其實本質也是讀檔案,大檔案比較耗時,肯定會影響系統性能,如果我們要儲存圖檔,就存個url的字段就好了~
demo源碼下載下傳