【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