安卓中使用SharedPreferences儲存javaBean類物件
阿新 • • 發佈:2019-01-27
安卓中儲存檔案的方法有多種多樣的,現在說的一種就是在開發中經常用到的SharedPreferences。相信接觸過一段時間安卓開發的朋友都會使用基本用法。(就算不會用,百度一下也有很多普通的用法教程)。
SharedPreferences儲存資料是以鍵值對的方式儲存Key = value;的形式。會發現有一系列的put過載方法,能存入的全是基本資料型別的value值,獲取的話也是一系列的get過載方法獲取value值。
那麼問題來了,如果我想在value中存一個java類物件該怎麼辦呢?根據系統提供的API是不能儲存的。
解決這個問題也就是把java類序列化以流的方式儲存進去。
下面直接上程式碼:
public static <T> void saveBean2Sp(Context context, T t, String fileName, String keyName) {
SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
ByteArrayOutputStream bos;
ObjectOutputStream oos = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(t);
byte[] bytes = bos.toByteArray();
String ObjStr = Base64.encodeToString(bytes, Base64.DEFAULT);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(keyName, ObjStr);
editor.commit();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上面這個靜態的方法就是把java類存入SharedPreferences中,第一個引數上下文物件,第二個引數需要儲存的實體類,第三個引數儲存的檔案的名稱,第四個引數鍵值。
注意:一定要在finally中把流關閉,因為流是非常耗費資源的。
public static <T extends Object> T getBeanFromSp(Context context, String fileName, String keyNme) {
SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
byte[] bytes = Base64.decode(preferences.getString(keyNme, ""), Base64.DEFAULT);
ByteArrayInputStream bis;
ObjectInputStream ois = null;
T obj = null;
try {
bis = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bis);
obj = (T) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return obj;
}
這個方法就是獲取java類物件的方法,只需要呼叫時第四個引數以存入時的鍵值就能獲取到存入的物件。
實體類:
public class LoginModelBean implements Serializable{
@SerializedName("loginTime")
private String loginTime;
@SerializedName("IP")
private String IP;
@SerializedName("id")
private int id;
@SerializedName("userId")
private int userId;
@SerializedName("token")
private String token;
public String getLoginTime() {
return loginTime;
}
public void setLoginTime(String loginTime) {
this.loginTime = loginTime;
}
public String getIP() {
return IP;
}
public void setIP(String IP) {
this.IP = IP;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
這裡要注意:實體類一定要實現Serializable序列化介面不然會報IOException異常(這裡是最容易忘記的,最好第一步就實現Serializable介面)
LoginModelBean loginModelBean = new LoginModelBean();
loginModelBean.setId(response.body().getResult().getId());
loginModelBean.setIP(response.body().getResult().getIP());
loginModelBean.setLoginTime(response.body().getResult().getLoginTime());
loginModelBean.setToken(response.body().getResult().getToken());
loginModelBean.setUserId(response.body().getResult().getUserId());
SPUtils.saveBean2Sp(mContext, loginModelBean,"loginData","loginModelBean");
這裡建立一個實體類把資料封裝好然後呼叫saveBean2Sp()方法把資料傳進去就行了。
SPUtils.getBeanFromSp(mContext, "loginData", "loginModelBean");
取出時呼叫上面這個方法即可。
如有錯誤或遺漏,歡迎提出討論。