今天看了朋友一个项目用到了Hawk,然后写了这边文章
一、了解一下概念
Android Hawk数据库github开源项目 Hawk是一个非常便捷的数据库.操作数据库只需一行代码,能存任何数据类型.
相信大家应该很熟悉SharedPreferences。它是一种轻量级的存储简单配置信息的存储机制,以key-value的形式保存数据。 本文介绍就是基于SharedPreferences的的存储框架,是由Orhan Obut大神写的, 它是Secure,simple key-value storage for Android。安全简单的Android存储工具。
这里附上Orhan Obut大神的Github 地址 https://github.com/orhanobut
**
二、用法
**
1.添加依赖
compile 'com.orhanobut:hawk:2.0.1'
2.初始化
Hawk.init(this).build();
这两步就可以正常使用了,那就看一下API吧
<T> :Saves any type including any collection, primitive values or custom objects
任何数据类型()
存数据
public static <T> boolean put(String key, T value) {
return hawkFacade.put(key, value);
}
取数据
public static <T> T get(String key) {
return hawkFacade.get(key);
}
总数量
public static long count() {
return hawkFacade.count();
}
删除全部数据
public static boolean deleteAll() {
return hawkFacade.deleteAll();
}
删除某个数据
public static boolean delete(String key) {
return hawkFacade.delete(key);
}
是否包含有某个的数据
public static boolean contains(String key) {
return hawkFacade.contains(key);
}
来验证如果准备使用。如果正确地初始化和建造@return真实。否则错误。
public static boolean isBuilt() {
return hawkFacade.isBuilt();
}
public static void destroy() {
hawkFacade.destroy();
}
下面是在官网图片 让我们看看它是怎么工作的
看图片一目了然左边的PUT方法中,是把T value 存储到Disk当中。大致流程是,先将数据进行toString的转换,接下来是加密,然后进行序列化,最后是存储,用的就是SharePreference的存储。获取数据时就正好逆过来啦。
三、源码解析开始啦
先看看初始化的代码
Hawk.init(this).build();
/**
* This will init the hawk without password protection.
*
* @param context is used to instantiate context based objects.
* ApplicationContext will be used
*/
public static HawkBuilder init(Context context) {
HawkUtils.checkNull("Context", context);
hawkFacade = null;
return new HawkBuilder(context);
}
static void build(HawkBuilder hawkBuilder) {
hawkFacade = new DefaultHawkFacade(hawkBuilder);
}
初始化中创建了HawkBuilder对象,下面如下代码
public HawkBuilder(Context context) {
HawkUtils.checkNull("Context", context);
this.context = context.getApplicationContext();
}
public void build() {
Hawk.build(this);
}
其中也用到了 HawkUtils,看一下代码
这个工具类就是对数据的判空处理
final class HawkUtils {
private HawkUtils() {
//no instance
}
public static void checkNull(String message, Object value) {
if (value == null) {
throw new NullPointerException(message + " should not be null");
}
}
public static void checkNullOrEmpty(String message, String value) {
if (isEmpty(value)) {
throw new NullPointerException(message + " should not be null or empty");
}
}
public static boolean isEmpty(String text) {
return text == null || text.trim().length() == 0;
}
}
上面有个最重的没有看完 DefaultHawkFacade
先看一下源码吧
public DefaultHawkFacade(HawkBuilder builder) {
encryption = builder.getEncryption();
storage = builder.getStorage();
converter = builder.getConverter();
serializer = builder.