Android-儲存:SharedPreferences使用及其儲存型別
日常開發中我們常常要用到儲存資料,Android中常用的儲存方式有SQLite,sharedPreferences 等,當然也有各自的應用場景,前者適用於儲存較多資料的情形,後者責傾向於儲存使用者偏好設定比如某個checkbox的選擇狀態,使用者登入的狀態、配置資訊,實現記住密碼功能等等,都是以鍵值對的形式進行的檔案讀取。
但是每儲存一個數據都要提供一個key,如果要儲存多個數據那豈不是要寫多個key?例如我們要儲存一個使用者的登入資訊,比如使用者暱稱,個性簽名,登入時間………尼瑪我一條資料寫一個的話我都可以玩一盤擼啊擼了~反正我是受不了~那麼我們能否將使用者資訊封裝起來,統一以一個key來儲存呢?答案是肯定可以的~
Java類庫中提供的位元組輸入輸出流可以輕鬆幫我們完成任意型別到String的可逆轉換,繼而我們就可以儲存到Share中了~
SharedPreferences只能儲存簡單型別的資料,例如四種基本型別(int,float,long,boolean)+String。如果需要存取比較複雜的資料型別比如類或者影象,則需要對這些資料進行編碼,通常將其轉換成Base64編碼,然後將轉換後的資料以字串的形式儲存在XML檔案中。
簡單使用:
可儲存的型別:
string,int,float,long,boolean
//獲取sharedPreferences物件
SharedPreferences sharedPreferences = getSharedPreferences("zjl" , Context.MODE_PRIVATE);
//獲取editor物件
SharedPreferences.Editor editor = sharedPreferences.edit();//獲取編輯器
//儲存鍵值對
editor.putString("name", "周杰倫");
editor.putInt("age", 24);
editor.putBoolean("isMarried", false);
editor.putLong("height", 175L);
editor .putFloat("weight", 60f);
editor.putStringSet("where", set);
//提交
editor.commit();//提交修改
SharedPreferences sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE);
//getString()第二個引數為預設值,如果preference中不存在該key,將返回預設值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
儲存物件:
方法一:fastJson/Gson/Jackson將物件轉換成字串,然後再儲存。
方法二:ObjectOutputStream將物件轉化成流,base64將流轉成字串,然後再儲存。
package com.example.draggridview;
/**
* Created by Administrator on 2017/6/19.
*/
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* SharedPreferences工具類,可以儲存object物件
*/
public class SharedPreferenceUtil {
/**
* 存放實體類以及任意型別
*
* @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(), 0));
SharedPreferences.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(), 1);
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
obj = ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
參考:
AIDL支援的資料型別
- 所有基礎型別(byte/short/int/long/float/double/boolean/char 等)
- String,List,Map,CharSequence等類
- 其他AIDL介面型別
- 所有Parcelable的類
bundle可傳遞資料型別:
1、byte/short/int/long/float/double/boolean/char等八種基本型別或它們對應的陣列,
2、String、charsequence或對應的陣列,也可以是物件()或物件陣列。
3、Bundle.putSerializable(Key,Object); //實現Serializable介面的物件
4、Bundle.putParcelable(Key, Object); //實現Parcelable介面的物件
intent可傳遞資料型別:
intent傳遞型別(abcd)
A、Serializable B、charsequence C、Parcelable D、Bundle
1、八種基本資料型別 及其對應陣列
2、String/Charsequence 及其對應陣列
3、Parcelable 及其對應陣列 /Serializable
4、bundle/intent