美文网首页
Android 数据存储之SharedPreferences

Android 数据存储之SharedPreferences

作者: xiesen | 来源:发表于2019-07-16 11:17 被阅读0次

SharedPreferences简介

SharedPreferences是Android提供的一种存储数据的机制,用于存储少量数据,数据类型包括(boolean 、int、long、float、string),主要用于存储应用的配置信息,例如:用户名、密码、是否开启震动、音乐等。

​ 它实际上是以键值对的形式储存在xml文件中。存储位置:data/data/程序包名/shared_prefs/ 目录下。

保存数据

先看下代码:

SharedPreferences mPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mPreferences.edit();
mEditor.putInt("int", 1);
mEditor.putBoolean("boolean", true);
mEditor.putFloat("float", 3.14f);
mEditor.putLong("long", 123l);
mEditor.putString("string", "abcd");
mEditor.commit();
mPreferences.registerOnSharedPreferenceChangeListener(mListener);

第1行 通过context获取SharedPreferences对象SharedPreferences
第一个参数表示要操作的xml文件名。
第二个参数 操作模式,操作模式如下:Context类中的变量,类型为public static final int。

  • MODE_PRIVATE = 0x0000; 0 默认模式,指定该SharedPreferences数据只能被本应用程序读、写。
  • MODE_WORLD_READABLE = 0x0001; 1 指定数据可以被其他应用程序读,但不能写。
    创建可读的文件是很危险的,而且可能以引起应用程序的安全漏洞。强烈劝阻;相反,应用程序应该使用的互动更加正式的机制 如{ContentProvider},{BroadcastReceiver}和{android.app.Service}。此变量在API级别17中已被弃用。
  • MODE_WORLD_WRITEABLE = 0x0002; 2 指定数据可以被其他应用程序写,但不能读。
    创建可写文件也是危险的,不推荐使用。此变量在API级别17中已被弃用。
  • MODE_MULTI_PROCESS = 0x0004; 4 文件将会在SharedPreference实例被装载到进程的时候检查是否被修改,主要用在一个应用有多个进程的情况。

第2行 获取Editor对象,通过editor对象来更改SharedPreferences中的内容。
第3~7行 设置键值对。
第8行 提交修改。(很重要,如果不执行则并没有更改数据)。

查看下Editor的一些方法: Editor的一些方法.png

以put开头的是设置键值对的方法。rmove方法用来移除某键值对。
apply() 和commit()都可以用来保存修改。

  • commit()有返回值,成功返回true,失败返回false。将内容修改从编辑器提交到SharedPreferences对象,这是原子到执行修改,替换当前在SharedPreferences中的任何内容。注意:当两个编辑器同时修改内容时,最后一个调用提交覆盖之前的更改。如果不关心返回值,并且从应用程序的主线程中使用该值,请考虑使用apply()。return 如果返回true,则表示将新值写入持久存储(硬件磁盘)成功,否则表示写入失败。
  • apply()没有返回值,apply()是将修改的数据提交到内存, 而后异步真正的提交到硬件磁盘,不会通知任何失败。
    如果SharedPreferences的另一个编辑器editor在apply异步提交伤胃完成时定期进行commit,则commit将阻塞,直到所有异步提交完成。
    由于SharedPreferences在一个进程中是单列的,如果忽略了返回值,可以安全的替换任何commit 到apply。

获取数据

代码如下:

int a = mPreferences.getInt("int", 0);
boolean bool = mPreferences.getBoolean("boolean", false);
float f = mPreferences.getFloat("float", 0.0f);
long l = mPreferences.getLong("long", 0);
String s = mPreferences.getString("string", "");
String wifi = mPreferences.getString("wifi", "5566");

监听数据改变

SharedPreferences类中提供了监听数据变化的接口,代码如下

private OnSharedPreferenceChangeListener mListener= 
        new OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        Log.i(TAG, "Changed key="+key);
    }
};
//注册监听
mPreferences.registerOnSharedPreferenceChangeListener(mListener);

当SharedPreferences中的数据修改后,会回调mListener中的onSharedPreferenceChanged方法,通过参数key可以知道哪个键值进行了变动。
我们来尝试修改一下:

mEditor.putInt("int", 1);
mEditor.putString("string", "ab");
mEditor.remove("long");
mEditor.commit();

打印如下:

06-27 11:55:47.015 I/MainActivity( 2408): Changed key=string
06-27 11:55:47.015 I/MainActivity( 2408): Changed key=long

由于原先的int键对应的值为1,该值没有改变,所以不会回调onSharedPreferenceChanged。而string键的值由abcd变成了ab,删除了long键,所以这两个键更改都有回调。

取消监听SharedPreference

mPreferences.unregisterOnSharedPreferenceChangeListener(mListener);

以上就是SharedPreferences的简单用法。

总结

 1)写入数据:
     //步骤1:创建一个SharedPreferences对象
     SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
     //步骤2: 实例化SharedPreferences.Editor对象
     SharedPreferences.Editor editor = sharedPreferences.edit();
     //步骤3:将获取过来的值放入文件
     editor.putString("name", “Tom”);
     editor.putInt("age", 28);
     editor.putBoolean("marrid",false);
     //步骤4:提交               
     editor.commit();


 2)读取数据:
     SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
     String userId=sharedPreferences.getString("name","");
  
3)删除指定数据
     editor.remove("name");
     editor.commit();


4)清空数据
     editor.clear();
     editor.commit();

Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写;
Context.MODE_WORLD_READABLE:  指定该SharedPreferences数据能被其他应用程序读,但不能写;
Context.MODE_WORLD_WRITEABLE:  指定该SharedPreferences数据能被其他应用程序读;
Context.MODE_APPEND:该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;

相关文章

网友评论

      本文标题:Android 数据存储之SharedPreferences

      本文链接:https://www.haomeiwen.com/subject/svezkctx.html