Android入门——数据存储之SharedPreferences详解与应用

引言

很多时候,我们在应用程序开发过程中常常会需要保存一些少量的数据,而且格式也不复杂,都是些简单的字符串、布尔值、简单集合等,比如说应用程序的配置信息、游戏中玩家的积分等,正是基于此SharedPreferences应运而生。

一、SharedPreferences概述

SharedPreferences是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的 getSharedPreferences(String, int)来获取对应的实例,它主要负责读取应用程序Preferences数据,而SharedPreferences自身并没有直接操作数据的能力而是通过调用edit()方法来先得到SharedPreferences.Editor对象,进而实现对数据的编辑和删除,再由系统封装成键值对的xml文件保存在../data/data/app packagename/shared_prefs/xxx.xml。并且对于任何特定设置的首选项,所有的客户端共享的单个实例。修改首选项必须经过一个SharedPreferences.Editor对象,以确保优先值保持一致的状态和控制。

二、SharedPreferences源码

public interface SharedPreferences {
    public interface OnSharedPreferenceChangeListener {
        void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key);
    }

    public interface Editor {
        Editor putString(String key, @Nullable String value);
        Editor putStringSet(String key, @Nullable Set<String> values);
        Editor putInt(String key, int value);
        Editor putLong(String key, long value);
        Editor putFloat(String key, float value);
        Editor putBoolean(String key, boolean value);
        Editor remove(String key);
        Editor clear();
        boolean commit();
        void apply();
    }
    Map<String, ?> getAll();//获取所有的键值对
    @Nullable
    String getString(String key, @Nullable String defValue);
    @Nullable
    Set<String> getStringSet(String key, @Nullable Set<String> defValues);//获取set
    int getInt(String key, int defValue);
    long getLong(String key, long defValue);
    float getFloat(String key, float defValue);
    boolean getBoolean(String key, boolean defValue);//获取存储的布尔值
    boolean contains(String key);//检查是否包含指定key
    Editor edit();//返回Editor对象
    void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);//onChange监听注册
    void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);//取消OnChange监听
}

三、SharedPreferences的应用

1、创建SharedPreferences实例

创建SharedPreferences实例分为两种情况:第一种创建当前应用的,只能通过Context的getSharedPreferences(String name, int mode);第二种创建其他应用的,这两种都是需要调用同一方法,其中第二个参数mode为参数,有四种取值

  • MODE_PRIVATE 只能被当前应用读取
  • MODE_WORLD_READABLE 可被其他应用读但不能写
  • MODE_WORLD_WRITEABLE 可被其他应用读写
  • MODE_MULTI_PROCESS 支持多线程

1.1、创建当前应用的SharedPreferences实例

直接使用当前的上下文Context对象来调用getSharedPreferences

SharedPreferences sharedPreferences=getSharedPreferences("filename",MODE_PRIVATE);

1.2、创建第三方应用的SharedPreferences实例

与创建自身的实例不同的是,我们需要先得到第三方应用的上下文对象,再去调用。

Context context=createPackageContext("packgename",CONTEXT_IGNORE_SECURITY);
sharedPreferences=context.getSharedPreferences("filename",MODE_WORLD_WRITEABLE);

2、管理SharedPreferences

上面已经讲过SharedPreferences的实例是不能直接管理操作数据的,一切数据操作都是要由SharedPreferences.Editor来完成,所以管理SharedPreferences需要三步。

2.1、得到SharedPreferences.Editor管理对象

SharedPreferences.Editor editor=sharedPreferences.edit();

2.2、通过SharedPreferences.Editor对象来调用数据操作方法

值得注意的是Editor并没有提供对应的update名称的方法,因为当我们put操作的时候,他会自动帮我们判断,如果没有这个key则新建键值对,如果已经存在则覆盖旧值。

  • SharedPreferences.Editor putBoolean(String key, boolean value)
  • SharedPreferences.Editor putFloat(String key, float value)
  • SharedPreferences.Editor putInt(String key, int value)
  • SharedPreferences.Editor putLong(String key, long value)
  • SharedPreferences.Editor putString(String key, String value)
  • SharedPreferences.Editor putStringSet(String key, Set values)
  • SharedPreferences.Editor remove(String key)
  • SharedPreferences.Editor clear()

2.3、commit提交数据操作

执行了一系列操作后,要想保存操作的结果一定不要忘了commit,有点像数据库的事务操作。

editor.commit();//提交修改

3、访问SharedPreferences

这个SharedPreferences的设计机制真的蛮有意思,访问和操作使用的不是同一个对象,操作借助SharedPreferences.Editor,而访问则是使用SharedPreferences实例来调用相关方法,所以只要我们获取到相应的SharedPreferences实例即可。

  • Map<String, ?> getAll()
  • boolean getBoolean(String key, boolean defValue)
  • float getFloat(String key, float defValue)
  • int getInt(String key, int defValue)
  • long getLong(String key, long defValue)
  • String getString(String key, String defValue)
  • Set<String> getStringSet(String key, Set defValues)

4、SharedPreferences的简单应用

public class MainActivity extends Activity {
    private SharedPreferences sharedPreferences;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void readPrefs(View v ){
        if (sharedPreferences!=null){
            int no=sharedPreferences.getInt("no",-1);
            String name=sharedPreferences.getString("name", "cmo");
            Toast.makeText(MainActivity.this,no+name,Toast.LENGTH_LONG).show();
        }
    }
    public void writePrefs(View v){
        sharedPreferences=getSharedPreferences(getPackageName()+"prefs",MODE_PRIVATE);
        SharedPreferences.Editor editor=sharedPreferences.edit();
        editor.putInt("no",99);
        editor.putString("name", "CrazyMO");
        editor.commit();
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrazyMo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值