商城项目实战 | 13.1 Android 数据存储之 SharedPreferences 的存储方式和安全性

本文为菜鸟窝作者刘婷的连载。”商城项目实战”系列来聊聊仿”京东淘宝的购物商城”如何实现。
每个程序猿必备的110本经典编程书,免费领取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA
140套Android优秀开源项目源码,领取地址:http://mp.weixin.qq.com/s/afPGHqfdiApALZqHsXbw-A
或欢迎勾搭运营小姐姐(微信 id:BT474849)免费领取哦~

在 Android 的数据存储方式总共有五种,分别为 file 文件存储、 SQlite 数据库存储、ContentProvider 内容提供器存储、网络存储以及这篇文章中要介绍的 SharedPreferences 内存存储。其中 SharedPreferences 在应用中应用的比较多,也比较常见。

SharedPreferences 详细介绍

1. SharedPreferences 的原理

SharedPreferences 的核心原理简而言之就是一句:键值对的简单存储。SharedPreferences 用来保存基于 XML 文件存储的 key-value 键值对数据,通常用来存储一些简单的配置信息。通过 DDMS 的 File Explorer 的面板,展开文件浏览树,很明显 SharedPreferences 数据总是存储在 /data/data/<package name>/shared_prefs 目录下,所以也称之为内存存储。

2. SharedPreferences 的适用范围

SharedPreferences 主要是适用于保存少量的数据,且这些数据的格式非常简单,有字符串型、整型等基本类型,用的比较多的场合比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等)、QQ 保存密码等。

3. SharedPreferences 的优缺点

SharedPreferences 的原理以及适用范围显示了 SharedPreferences 有不少不足之处,但是也说明了它有着独特的优势。

3.1 SharedPreferences 的缺点

  1. 只能存储 boolean,int,float,long 和 String 五种简单的数据类型。
  2. 不论 SharedPreferences 的数据存储操作是如何简单,但是存储的数据只是少量的,所以无法完全替代如 SQLite 数据库这样的其他数据存储方式。
  3. 无法进行条件查询等复杂操作,对于数据的处理只能是简单的处理。

3.2 SharedPreferences 的优点

  1. SharedPreferences 存储数据在内存中,所以安全性方面比较高。
  2. SharedPreferences 对象与 SQLite 数据库相比,免去了创建数据库,创建表,写 SQL 语句等诸多操作,使用方法简单。
  3. 可以基本满足对少量数据的存储操作,如果数据量不大的情况下,SharedPreferences 是首选。

在只需要对简单数据进行存储的时候,最优的选择依然是 SharedPreferences,下面来看下 SharedPreferences 的使用方法。

SharedPreferences 的使用方法

SharedPreferences 作为数据存储方式之一,主要的使用方法就是写数据和读取数据了。

1. 写入数据

在写入数据的时候涉及到 put 方法,这个方法在数据的处理中很常见,下面是 SharedPreferences 中是如何使用 put 来存储数据的。

public static boolean putInt(Context context, String key, int value) {
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt(key, value);
        return editor.commit();
    }

这里存储的是 int 类型的数据,将数据 put 后,还要有一步就是要 commit ,提交数据,根据 commit() 方法返回的 boolean 值来判断数据是否写入成功,true 是写入成功, false 则是操作失败了。

2. 读取数据

既然写入数据的时候需要 put ,那么获取数据就会想到 get 方法,没错,在 SharedPreferences 中获取数据是使用的 get 方法,代码如下。

 public static int getInt(Context context, String key, int defaultValue) {
        SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return settings.getInt(key, defaultValue);
    }

直接 get 就可以拿到数据,如此简单的使用也使得 SharedPreferences 实在是数据存储的很好选择。

3. 数据变化的监听

已经知道了数据的写和读,那么如何知道存储的数据有所变化了呢,往下看。

SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

            }
        };

settings.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//注册数据变化监听

settings.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解注册数据变化监听

对于内存中数据的变化监听也很方便,直接添加监听事件就好。

SharedPreferences 的安全性

在本文的前面也说过了,SharedPreferences 的安全性相对较高,为什么这么说呢?首先看下下面这行代码。

SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);

这是 SharedPreferences 的创建,第一个参数 PREFERENCE_NAME 表示要操作的 xml 文件名,而第二个参数则是对于数据的安全性考虑的,表示文件的访问权限以及文件数据写入方式,主要有以下四种。

Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取
Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入
Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

在默认的情况下面,存储的数据是私有的,只能被应用本身所访问,这也是官方所提倡的,SharedPreferences 相对于其他的数据存储方式来讲,安全性要高。

结束语

SharedPreferences 在 Android 开发中是非常常见的数据存储方式,使用简单安全性也高。购物车模块中的商品数据因为是用户暂时存储的商品、加上一般购物车中的商品不会太多,也没必要上传到网络服务器中去,所以在后面的购物车的商品数据存储我们也将使用 SharedPreferences 的存储方式。

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

推荐阅读更多精彩内容

  • 任何一个应用程序,其实说白了就是在不停地和数据打交道,我们聊QQ、看新闻、刷微博,所关心的都是里面的数据,...
    AndYMJ阅读 1,641评论 2 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 莫名相识的季节是谁带来了风的问候吹动荷叶滚落下雨滴的忧伤我举起相机试着留下你安静时模样
    终南山士阅读 127评论 0 1
  • 池塘在那里 衰荷将落不落 旧巷在那里 老街将走不走 宇宙在那里 时光将老不老 我还在这里 但你不会回头 我祈愿阳光...
    秋意裸裸素色客阅读 216评论 2 0
  • 元状态机MSM是C++库boost里引入的,全称是Meta State Machine。元状态机可以简单理解为由元...
    vsf_simon阅读 1,190评论 0 0