【Android】SharedPreferences 存储

Android 提供多种选项来保存永久性数据。不同的存储方案取决于不同的需求。

存储选项

共享首选项

在键值对中存储私有原始数据。(SharedPreferences)

内部存储

在设备内存中存储私有数据。

外部存储

在共享的外部存储中存储公共数据。(注意申请读写权限)

SQLite 数据库

在私有数据库中存储结构化数据。

网络连接

在网络中使用您自己的网络服务器存储数据。

SharedPreferences 框架

SharedPreferences 以 Map 形式存放简单的配置参数,可以用来保存任何原始数据:布尔值、浮点值、整型值、长整型和字符串。 此数据将跨多个用户会话永久保留(即使您的应用已终止亦如此)。

其数据保存在 /data/data/xxx/shared_prefs 目录下,普通用户日常操作中难以修改到,所以存储一些轻量级的数据比较简单方便。

(注意,从名字上就知道不完全,重要数据请采用内部存储或者数据库加密等机制)。

1. 获取 SharedPreferences


private static final String PREFS_NAME = "TEST_SharedPreferences";
private static SharedPreferences mSharedPreferences = null;

@Override
protected void onCreate(Bundle state){
    super.onCreate(state);

    ...

    // Restore preferences
    mSharedPreferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}

getSharedPreferences 参数说明


SharedPreferences getSharedPreferences(String name, int mode);

说明

name

用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个

mode

用于指定操作模式,下面 Context.MODE_xxx 的类型

Context.MODE_PRIVATE

指定该 SharedPreferences 数据只能被本应用程序读、写。(默认值,值为 0 )

Context.MODE_WORLD_READABLE

指定该 SharedPreferences 数据能被其他应用程序读,但不能写。(Android N 开始不再支持)

Context.MODE_WORLD_WRITEABLE

指定该 SharedPreferences 数据能被其他应用程序读。(Android N 开始不再支持)

Context.MODE_APPEND

该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

2. 读取数据

根据获取数据的类型不同,主要形式为:mSharedPreferences.getXXX(key, defValue)

接口如下:


Map<String, ?> getAll();                                                 // 获取该 SharedPreferences 对象下所有的数据,以 Map 的形式返回。
String getString(String key, @Nullable String defValue);                 // 获取名字为 key 的数据,返回 String 类型的数据,失败返回 defValue .
Set<String> getStringSet(String key, @Nullable Set<String> defValues);   // 获取名字为 key 的数据,返回 Set<String> 类型的数据(类似与数组),失败返回 defValues .
int getInt(String key, int defValue);                                    // 获取名字为 key 的数据,返回 int 类型的数据,失败返回 defValue .
long getLong(String key, long defValue);                                 // 获取名字为 key 的数据,返回 long 类型的数据,失败返回 defValue .
float getFloat(String key, float defValue);                              // 获取名字为 key 的数据,返回 float 类型的数据,失败返回 defValue .
boolean getBoolean(String key, boolean defValue);                        // 获取名字为 key 的数据,返回 boolean 类型的数据,失败返回 defValue .

如:

获取 key 为 “作者” 的 String 类型数据。

获取 key 为 “年龄” 的 int 类型数据。

通过:


mSharedPreferences.getString("作者", "#查无此人#");
mSharedPreferences.getInt("年龄", -1);

成功将返回 key 为 “作者” 对应的数据(类型为 String),失败将返回 defValue (即 “#查无此人#”)。

成功将返回 key 为 “年龄” 对应的数据(类型为 int),失败将返回 defValue (即 -1)。

3. 写入数据

SharedPreferences 类型的对象属于“只读”的,不可以通过 SharedPreferences 对象进行数据的修改。

写入或修改数据,需要获取 SharedPreferences.Editer 类型的数据。

如:

修改 key 为 “作者” 的数据为 “奔波儿灞” (类型 String)

新增 key 为 “著作” 的数据为 “《大王叫我来巡山啊…》” (类型 String)

根据存入数据的类型不同,主要形式为:mSharedPreferences.putXXX(key, value)


SharedPreferences.Editor edit = mSharedPreferences.edit();
    edit.putString("作者", "奔波儿灞");                            // 已有 key , 将更新。
    edit.putString("著作", "《大王叫我来巡山啊...》");              // 未有 key , 将新增。
    edit.commit();                                                // 必须提交了,

具体写入接口如下:


Editor putString(String key, @Nullable String value);           // 存入名为 key , 值为 value (类型为 String ) 的数据.
    Editor putStringSet(String key, @Nullable Set<String> values);  // 存入名为 key , 值为 value (类型为 Set<String> ) 的数据.
    Editor putInt(String key, int value);                           // 存入名为 key , 值为 value (类型为 int ) 的数据.
    Editor putLong(String key, long value);                         // 存入名为 key , 值为 value (类型为 long ) 的数据.
    Editor putFloat(String key, float value);                       // 存入名为 key , 值为 value (类型为 float ) 的数据.
    Editor putBoolean(String key, boolean value);                   // 存入名为 key , 值为 value (类型为 boolean ) 的数据.

注意,写入设置完,必须 commit 。( commit 返回值 true 表示提交成功,有时候使用 SharedPreferences 出错注意查看返回值 )

因为对应的 SharedPreferences.Editor 数据与 SharedPreferences 数据不是存在同一个地方的。

需要使用 commit 同步 SharedPreferences 的数据并写入 xml 文件中。

4. 删除数据

可以删除单个 key 对应的数据,也可以清空所有数据。

删除单个数据


SharedPreferences.Editor edit = mSharedPreferences.edit();
    edit.remove("年龄");
    edit.remove("著作");
    edit.commit();            // 必须 commit

清空所有数据


SharedPreferences.Editor edit = mSharedPreferences.edit();
    edit.clear();
    edit.commit();            // 必须 commit