android SharedPreferences的一般用法(存取清删)

来源:互联网 发布:淘宝公益广告联盟图片 编辑:程序博客网 时间:2024/06/05 09:27

之前做应用时碰到这样一个问题:在“A” Activity 要与 “B” Activity的Fragment进行通信传值,但是忽然发现无法拿到B中Fragment的Handler,又不能发送广播,短暂的思考之后想到了SharedPreferences这个轻型的数据存储方式。

  SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,用Sqlite数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率。其存储位置在/data/data/<包名>/shared_prefs目录下。

  另外SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。


  使用SharedPreferences保存key-value对的步骤如下:

  (1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定,第二个参数指定访问应用程序私有文件的权限。

  (2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。

  (3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。

  (4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。

 

                              存放数据信息,步骤如下:

  a、打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences

SharedPreferences userSettings = getSharedPreferences("setting",Activity.MODE_PRIVATE);


第一个参数是生成xxx.xml文件的文件名字,第二个参数是文件的访问权限以及文件数据写入方式。简单说明一下几种方式:

Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取,
Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入;
Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

  b、让setting处于编辑状态

SharedPreferences.Editor editor = userSettings.edit();

  c、存放数据

editor.putString("name","ATAAW");
editor.putString("URL","ATAAW.COM");

  d、完成提交

editor.commit();

                              读取数据信息,步骤如下:

  a、获取Preferences

SharedPreferences userSettings= getSharedPreferences("setting", 0);

  b、取出数据

String name = userSettings.getString("name","默认值");
String url = userSettings.getString("URL","default");

  以上就是Android中SharedPreferences的具体使用方法。

  注意:只顾着说存取的方法了,补充一点哈,那就是删除和清空操作,如下:

  a、清除指定数据

SharedPreferences.Editor editor = userSettings.edit();
editor.remove("KEY");
editor.commit();

  b、清空数据

SharedPreferences.Editor editor = userSettings.edit();
editor.clear();
editor.commit();

  注意:如果在 Fragment 中使用SharedPreferences 时,需要放在onAttach(Activity activity)里面进行SharedPreferences 的初始化,否则会报空指针 即 getActivity()会可能返回null !


具体例子代码如下:

public class Session {    public final static String TAG = Session.class.getName();    public static final String COOKIE = "COOKIE";    ///////////////////////命名规则 config的属性或session的属性的开头    //当前登录的用户返回User类型    public static final String SESSION_CURRENT_USER_INFO = "SESSION_CURRENT_USER_INFO";    private Map<String , Object> data;    private SharedPreferences currentUserSharedPreferences ;    public Session(Context context , String userId){        data = new HashMap<String , Object>();        currentUserSharedPreferences = context.getSharedPreferences(userId, Activity.MODE_PRIVATE);    }    public synchronized void clear(){        try {            data = new HashMap<String, Object>();            this.currentUserSharedPreferences = null;        }catch (Exception e){}    }    /**     * 删除key     * @param key     * @return     */    public boolean remove(String key){        try {            data.remove(key);            SharedPreferences.Editor editor = currentUserSharedPreferences.edit();            editor.remove(key);            editor.commit();        }catch (Exception e){            e.printStackTrace();            return false;        }        return true;    }    /**     * 此方法是记录当前登录用户的信息,每次登录会根据用户的id获取不同的信息,所以不同的用户获取的属性都不一致     * @param key     * @return     */    public Object get(String key){        try {            if(data.get(key) != null){                return data.get(key);            }            if (currentUserSharedPreferences.contains(key)) {                String string = currentUserSharedPreferences.getString(key, "");                if(TextUtils.isEmpty(string)){                    return null;                }else{                    //16进制的数据转为数组,准备反序列化                    byte[] stringToBytes = StringToBytes(string);                    ByteArrayInputStream bis=new ByteArrayInputStream(stringToBytes);                    ObjectInputStream is=new ObjectInputStream(bis);                    data.put(key , is.readObject());                    //返回反序列化得到的对象                    return data.get(key);                }            }        } catch (StreamCorruptedException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        } catch (Exception e){            e.printStackTrace();        }        //所有异常返回null        return null;    }    /**     * 此方法只给当前的用户进行赋值     * @param key     * @param val 必须实现 Serializable Object     */    public boolean put(String key , Object val){        try {            data.put(key , val);            SharedPreferences.Editor editor = currentUserSharedPreferences.edit();            //先将序列化结果写到byte缓存中,其实就分配一个内存空间            ByteArrayOutputStream bos = new ByteArrayOutputStream();            ObjectOutputStream os = new ObjectOutputStream(bos);            //将对象序列化写入byte缓存            os.writeObject(val);            //将序列化的数据转为16进制保存            String bytesToHexString = bytesToHexString(bos.toByteArray());            //保存该16进制数组            editor.putString(key, bytesToHexString);            editor.commit();        }catch (Exception e){            e.printStackTrace();            return false;        }        return true;    }    /**     * desc:将数组转为16进制     * @param bArray     * @return     * modified:     */    private 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:16进制的数据转为数组     * @param data     * @return     * modified:     */    private 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;    }}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注册二级消防工程师 注册消防工程师论坛 一级注册消防工程师教材 注册消防工程师报名 二级消防工程师考试科目 消防工程师报考条件二级 二级注册消防工程师报考条件 一级注册消防工程师论坛 二级消防工程师好考吗 一级注册消防工程师招聘 注册消防工程师难考吗 考一级消防工程师有用吗 消防工程师难度 一消防工程师 一级消防工程师考试难度 一级消防工程师好考吗 消防工程师待遇 注册消防工程师一级二级区别 一级注册消防工程师好考吗 注册消防工程师好不好考 一级消防工程师难度 二级注册消防工程师考试科目 二级消防考试时间 一级消防工程师招聘 陕西二级消防工程师报名时间 2017消防工程师考试时间 消防工程师代报名 消防技术综合能力 一级注册消防工程师报考条件 河北二级消防工程师报名时间 二级消防工程师报名条件 消防员考试报考条件 消防技术实务 一级注册消防工程师报名时间 消防安全工程师考试时间 消防注册工程师报考条件 2017一级消防工程师报名时间 二级消防考试科目 辽宁消防工程师报名时间 一级消防工程师免考条件 注册消防工程师考哪几门