Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android使用SharedPreferences保存對象

Android使用SharedPreferences保存對象

編輯:關於Android編程

核心原理:

對象序列化

步驟

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

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

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

下面是完整代碼

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

public class Sertest implements Serializable{
    private String name;
    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進制的數據轉為數組
     * 

創建人:聶旭陽 , 2014-5-25 上午11:08:33

* @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= '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; }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved