本文为菜鸟窝作者刘婷的连载。”商城项目实战”系列来聊聊仿”京东淘宝的购物商城”如何实现。
每个程序猿必备的110本经典编程书,免费领取地址:http://mp.weixin.qq.com/s/cx433vAj_CDLzmhOoUS6zA
在 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 的缺点
- 只能存储 boolean,int,float,long 和 String 五种简单的数据类型。
- 不论 SharedPreferences 的数据存储操作是如何简单,但是存储的数据只是少量的,所以无法完全替代如 SQLite 数据库这样的其他数据存储方式。
- 无法进行条件查询等复杂操作,对于数据的处理只能是简单的处理。
3.2 SharedPreferences 的优点
- SharedPreferences 存储数据在内存中,所以安全性方面比较高。
- SharedPreferences 对象与 SQLite 数据库相比,免去了创建数据库,创建表,写 SQL 语句等诸多操作,使用方法简单。
- 可以基本满足对少量数据的存储操作,如果数据量不大的情况下,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 的存储方式。