1. 程式人生 > >Android SharedPreferences保存和讀取對象

Android SharedPreferences保存和讀取對象

version editor amp byte corrupted share pty long []

SharedPreferences保存和讀取對象

1.首先要序列化對象(以下是序列化實體類的樣例,不方便貼出實體類全部的代碼)

public class LoginResult extends BaseResult implements Serializable{

	private static final long serialVersionUID = 1L;
	
	private String mobiletoken;

2.保存和讀取對象的封裝

public class ObjectSaveUtil {
	
	private final static String FILENAME = "login_data_save";
	
	private final static String KEY = "loginResult";
	
	  /**
	   * desc:保存對象	 
	   * @param context
	   * @param key 
	   * @param obj 要保存的對象,僅僅能保存實現了serializable的對象
	   * modified:	
	   */
	  public static void saveObject(Context context,Object obj){
	      try {
	          // 保存對象
	          SharedPreferences.Editor sharedata = context.getSharedPreferences(FILENAME, 0).edit();
	          //先將序列化結果寫到byte緩存中,事實上就分配一個內存空間
	          ByteArrayOutputStream bos=new ByteArrayOutputStream();
	          ObjectOutputStream os=new ObjectOutputStream(bos);
	          //將對象序列化寫入byte緩存
	          os.writeObject(obj);
	          //將序列化的數據轉為16進制保存
	          String bytesToHexString = bytesToHexString(bos.toByteArray());
	          //保存該16進制數組
	          sharedata.putString(KEY, bytesToHexString);
	          sharedata.commit();
	      } catch (IOException e) {
	          e.printStackTrace();
	          Log.e("", "保存obj失敗");
	      }
	  }
	  /**
	   * desc:將數組轉為16進制
	   * @param bArray
	   * @return
	   * modified:	
	   */
	  public static String bytesToHexString(byte[] bArray) {
	      if(bArray == null){
	          return null;
	      }
	      if(bArray.length == 0){
	          return "";
	      }
	      StringBuffer sb = new StringBuffer(bArray.length);
	      String sTemp;
	      for (int i = 0; i < bArray.length; i++) {
	          sTemp = Integer.toHexString(0xFF & bArray[i]);
	          if (sTemp.length() < 2)
	              sb.append(0);
	          sb.append(sTemp.toUpperCase());
	      }
	      return sb.toString();
	  }
	  /**
	   * desc:獲取保存的Object對象
	   * @param context
	   * @param key
	   * @return
	   * modified:	
	   */
	  public static Object readObject(Context context){
	      try {
	          SharedPreferences sharedata = context.getSharedPreferences(FILENAME, 0);
	          if (sharedata.contains(KEY)) {
	               String string = sharedata.getString(KEY, "");
	               if(TextUtils.isEmpty(string)){
	                   return null;
	               }else{
	                   //將16進制的數據轉為數組。準備反序列化
	                   byte[] stringToBytes = StringToBytes(string);
	                     ByteArrayInputStream bis=new ByteArrayInputStream(stringToBytes);
	                     ObjectInputStream is=new ObjectInputStream(bis);
	                     //返回反序列化得到的對象
	                     Object readObject = is.readObject();
	                     return readObject;
	               }
	          }
	      } catch (StreamCorruptedException e) {
	          // TODO Auto-generated catch block
	          e.printStackTrace();
	      } catch (IOException e) {
	          // TODO Auto-generated catch block
	          e.printStackTrace();
	      } catch (ClassNotFoundException e) {
	          // TODO Auto-generated catch block
	          e.printStackTrace();
	      }
	      //全部異常返回null
	      return null;
	      
	  }
	  /**
	   * desc:將16進制的數據轉為數組
	   * <p>創建人:聶旭陽 , 2014-5-25 上午11:08:33</p>
	   * @param data
	   * @return
	   * modified:	
	   */
	  public static byte[] StringToBytes(String data){
	      String hexString=data.toUpperCase().trim();
	      if (hexString.length()%2!=0) {
	          return null;
	      }
	      byte[] retData=new byte[hexString.length()/2];
	      for(int i=0;i<hexString.length();i++)
	      {
	          int int_ch;  // 兩位16進制數轉化後的10進制數
	          char hex_char1 = hexString.charAt(i); ////兩位16進制數中的第一位(高位*16)
	          int int_ch3;
	          if(hex_char1 >= '0' && hex_char1 <='9')
	              int_ch3 = (hex_char1-48)*16;   //// 0 的Ascll - 48
	          else if(hex_char1 >= 'A' && hex_char1 <='F')
	              int_ch3 = (hex_char1-55)*16; //// A 的Ascll - 65
	          else
	              return null;
	          i++;
	          char hex_char2 = hexString.charAt(i); ///兩位16進制數中的第二位(低位)
	          int int_ch4;
	          if(hex_char2 >= '0' && hex_char2 <='9')
	              int_ch4 = (hex_char2-48); //// 0 的Ascll - 48
	          else if(hex_char2 >= 'A' && hex_char2 <='F')
	              int_ch4 = hex_char2-55; //// A 的Ascll - 65
	          else
	              return null;
	          int_ch = int_ch3+int_ch4;
	          retData[i/2]=(byte) int_ch;//將轉化後的數放入Byte裏
	      }
	      return retData;
	}
	
}

挺好用的,歡迎大家復制使用


Android SharedPreferences保存和讀取對象