Android使用SharedPreferences保存數組

核心原理:

對象序列化

步驟

1.要保存的對象實現序列化Serializable

2.將序列化的對象保存String(本文的做法是保存爲byte數組在轉爲16進制的String類型保存起來)

3.將保存的String反序列化爲對象

下面是完整代碼

步驟1.要保存的對象實現序列化Serializable

public class Sertest implements Serializable{
    private String name;
    private String strs[];
    private int age;
}
步驟2。將序列化的對象保存String(本文的做法是保存爲byte數組在轉爲16進制的String類型保存起來)

步驟3.將保存的String反序列化爲對象

    /**
     * desc:保存對象
   
     * @param context
     * @param key 
     * @param obj 要保存的對象,只能保存實現了serializable的對象
     * modified:	
     */
    public static void saveObject(Context context,String key ,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 Object readObject(Context context,String key ){
        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進制的數據轉爲數組
 
     * @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_ch1;
            if(hex_char1 >= '0' && hex_char1 <='9')
                int_ch1 = (hex_char1-48)*16;   //// 0 的Ascll - 48
            else if(hex_char1 >= 'A' && hex_char1 <='F')
                int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
            else
                return null;
            i++;
            char hex_char2 = hexString.charAt(i); ///兩位16進制數中的第二位(低位)
            int int_ch2;
            if(hex_char2 >= '0' && hex_char2 <='9')
                int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
            else if(hex_char2 >= 'A' && hex_char2 <='F')
                int_ch2 = hex_char2-55; //// A 的Ascll - 65
            else
                return null;
            int_ch = int_ch1+int_ch2;
            retData[i/2]=(byte) int_ch;//將轉化後的數放入Byte裏
        }
        return retData;
  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章