SharedPreferences 轻量级的储存

说明:

1.SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activity暂停时,
将此activity的状态保存到SharedPereferences中;当Activity重载,系统回调方法onSaveInstanceState时,再从SharedPreferences中将值取出。
2.严格来说,SharedPreferences最好不要用来保存“用户配置”,比如,用户选择了什么铃声,是否自动更新等等。如果要为应用创建用户配置,
可以使用PreferenceActivity,它可以用来创建“用户配置”。(PreferenceActivity用来创建程序中的设置界面)
3.SharedPreferences保存的数据最好是基础数据类型(当然也可以用来保存用户配置,官方推荐PreferenceActivtiy )。

原理:以XML的结构保存在手机的/data/data/包名/shared_prefs文件夹下,数据以键值对(Map)的形式保存。例如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <float name="isFloat" value="1.5" />
    <string name="isString">Android</string>
    <int name="age" value="11" />
    <boolean name="boolean" value="true" />
    <set name="isStringSet">
        <string>element 1</string>
        <string>element 2</string>
    </set>
</map>

注意:SharedPreferences 只适合做轻量级的存储的,不适合大量数据存储的原因:

1.在UI线程中调用getXXX可能会导致ANR
2.在获取初始化SharePreferences 对象时会加载对应的xml文件的所有数据到内存中,若xml文件很大,占用内存就大,当想读取xml文件某一个key的值,但在我们获取的时候回加载整个文件
3.每次添加键值对都会重新写入整个文件的数据,而不是增量写入。

commit和apply:

1.apply没有返回值,而commint有返回值(boolean)
2.commint是同步把数据存放到硬盘,所以效率慢;apply是先保存到内存中,再开一个异步的线程保存到硬盘,不管成功否我们都不知道,所以速度快
3.apply是使用异步线程写入磁盘,commit是同步写入磁盘,在主线程使用的commit的时候,需考虑是否会出现ANR问题。

使用方法:

    //保存数据
    public void save(){
        /**
         参数 1 为存放的文件名称,没有则创建;
         参数 2 为保存的形式:
         Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写;
         Context.MODE_WORLD_READABLE:  指定该SharedPreferences数据能被其他应用程序读,但不能写,在Android N抛出SecurityException异常;
         Context.MODE_WORLD_WRITEABLE:  指定该SharedPreferences数据能被其他应用程序读,在Android N抛出SecurityException异常;
         Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;
         
         特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用
         */
        SharedPreferences sp=MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor=sp.edit();

        //以键值对形式存储:参 1 为 key, 参 2 为value
        editor.putString("name","小明");
        editor.putString("password","123");

        //提交 返回值是boolean
        editor.commit();
    }

    //获取key的值
    public void gain(){
        //同上, 但参数 1 一定要和保存时的文件名一致
        SharedPreferences sp=MainActivity.this.getSharedPreferences("share_data",Context.MODE_PRIVATE);
        //参数 1 是 保存时的 key值 ,参数 2 是 当不存在这个key时,默认这个key的值等于 参数 2
        String name=sp.getString("name",null);
        String password=sp.getString("password",null);
    }

    //清除某个key 的值
    public void remove(){
        SharedPreferences sp=MainActivity.this.getSharedPreferences("share_data",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=sp.edit();
        editor.remove("name");
        editor.commit();
    }

    //清空整个文件内容
    public void clean(){
        SharedPreferences sp = MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=sp.edit();
        editor.clear();
        editor.commit();
    }

    //是否存在某个key
    public void isHaveKey(){
        SharedPreferences sp = MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);
        boolean b=sp.contains("name");

    }

    //获取所有key
    public void getAllKey(){
        SharedPreferences sp = MainActivity.this.getSharedPreferences("share_data", Context.MODE_PRIVATE);
        Map<String,?> map=sp.getAll();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值