Android使用SharedPreferences保存对象

核心原理:

对象序列化

步骤

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进制的数据转为数组
     * <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_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;
  }

Android使用SharedPreferences保存对象,布布扣,bubuko.com

时间: 2024-12-23 21:41:03

Android使用SharedPreferences保存对象的相关文章

Android Spinner + SharedPreferences 保存上一次选择的值

android下拉可选菜单Spinner创建:1, 创建一个HelloSpinner的android project2, 修改main.xml文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="

Android使用SharedPreferences保存账号密码

有很多的应用都会有保存密码和账号的功能,比如QQ.接下来就讲讲使用SharedPreferences来保存密码和账号,也许有些人会考虑的数据库,但是我个人认为对于保存简单的数据,使用的数据库就大材小用了,SharedPreferences比较轻量级 首先写好布局,只有两个输入框和一个按钮 <EditText android:id="@+id/number" android:layout_width="match_parent" android:layout_h

Android 利用SharedPreferences保存与删除 用户登录数据

创建SharedPreferences对象: SharedPreferences sharedPreferences = context.getSharedPreferences("userInfo", MODE_PRIVATE); Editor editor = sharedPreferences.edit(); editor.putString("username", “用户名”); editor.putString("userid", &q

android 使用SharedPreferences保存list数据

List<Map<String, String>> list = new ArrayList<Map<String, String>>(); List<Map<String, String>> test = getInfo(this, "name"); for (int i = 0; i < test.size(); i++) { Map<String, String> itemMap = tes

Android中SharedPreferences和序列化结合保存对象数据

前言: 最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页时,还能查看和修改.刚开始解决这个问题我们一定会从数据的大小的角度来解决,于是就有以下几种方式: A.运用临时静态变量static来保存到内存中                               B.运用SharedPreferences来保存                       

Android SharedPreferences保存和读取对象

SharedPreferences保存和读取对象 1.首先要序列化对象(以下是序列化实体类的样例,不方便贴出实体类全部的代码) public class LoginResult extends BaseResult implements Serializable{ private static final long serialVersionUID = 1L; private String mobiletoken; 2.保存和读取对象的封装 public class ObjectSaveUtil

Android中利用SharedPreferences保存信息

package com.example.sharepreferen; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.vi

Android——配置文件的保存SharedPreferences进行数据存储

很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件或者xml进行保存.如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferen

AnyPref,可直接在SharedPreferences中保存对象实例的SharedPreferences工具类

有时候在写代码的时候经常会有一些要持久保存某个对象的需求,这时候如果动用Sqlite又觉得太重,使用SharedPreferences保存的话确实是轻量级了,但是还要针对对象的每个字段都要保存,可能要好多行代码,读取出来又是好多行代码,我们为什么不直接自动保存与读取对象中的字段呢,如果有保存几个不同对象的需求的话,那就能省下大量的代码了. AnyPref是一个SharedPreferences工具类,它可以直接保存某个对象到SharedPreferences中,使用方法: 在工程根目录build