【Android】SharedPreferences 存储

【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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 问:SharedPreferences 存储比较大或者比较读的键值对会有什么问题吗?为什么? 答:SharedPr...
    Little丶Jerry阅读 917评论 0 0
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,888评论 2 89
  • 一、Picasso的基本使用 (1)添加依赖 **(2)基本使用方法 基础用法 设置图片大小 加载过程错误处理图片...
    kjy_112233阅读 3,906评论 0 4
  • “减肥”大概是女人挂在嘴边频率最高的口头禅,在这个“非杨贵妃”时代,多瘦的人也永远嫌身上的肉多。然后打着减肥的...
    Candy_dai阅读 309评论 0 7
  • 2017年7月25日上午“初中骨干教师综合素质提升班”顺利开班,此次培训班由松阳县教师进修学校组织,培训对象为松阳...
    品运阅读 703评论 0 0