一:前言

今天做项目,准备使用本地存储,把一些数据存在本地磁盘上,比如用户名、密码这样的。其实大家都知道,这种情况最常用的就是SharedPreferences了,我也不例外,脑子里第一个想到的就是用这个。。。后来转念一想,有没有啥开源的轻量级的库,可以更好的帮我完成这件事呢,于是求助了度娘,果不其然,被我找到了两个库,Reservoir和ASimpleCache。

原谅我没有过多的去比较这两个库,直接采用了Reservoir,去实现本地数据存储。

啥是Reservoir呢?

官方说,Reservoir是一个简单的Android函数库,可以在磁盘上使用“键/值”对轻松地序列化并持久化对象。说白了,使用Reservoir,你可以把java对象进行序列化,并把它存储到磁盘上。当然,当你想从磁盘上查找到你保存的数据时,同样需要时用Reservoir。

二:
在Android Studio上配置Reservoir库

2.1
在project的gradle上,你需要添加

repositories
{

    jcenter()

}

2.2
在你module的gradle上,你需要添加Reservoir库

dependencies
{

    compile 'com.anupcowkur:reservoir:2.1'

}

三:
使用Reservoir存取数据

3.1 初始化Reservoir

Resrvoir在使用前,必须先进行初始化,一般情况下,我们会把该初始化操作方在Application的onCreate()方法里:

try {
Reservoir.init(this, 2048);
} catch (Exception e) {
e.printStackTrace();
}

初始化是必须进行的操作,假设我们未进行Reservoir的初始化,而直接使用它进行了数据的存取,则会出错:

3.2
使用Reservoir提供的put、putAsync方法进行数据存储

Reservoir提供了put、putAsync两个方法进行对象数据的存储,从名字就可以看出,一个是异步,一个是同步,本身并无多少区别,我们看下它提供了哪些存储对象的方法:

为了演示对象的存储,先提供一个Person类:

public class Person {
public String name; public int age; public Date birthday; public boolean sex; public Person(String name, int age, Date birthday, boolean sex) {
this.name = name;
this.age = age;
this.birthday = birthday;
this.sex = sex;
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
", sex=" + sex +
'}';
}
}

接下来,我们使用put方法,存储单个对象:

private static final String PERSON = "ONE_PERSON";
private void saveData() {
Person person = new Person("无缘", 25, new Date(), true);
try {
Reservoir.put(PERSON, person);
} catch (Exception e) {
e.printStackTrace();
}
}

当然,我们也可以使用putAsync

    private void saveDataAsync(){
Person person = new Person("无缘", 25, new Date(), true);
Reservoir.putAsync(PERSON, person, new ReservoirPutCallback() {
@Override
public void onSuccess() {
System.out.println("success");
} @Override
public void onFailure(Exception e) {
e.printStackTrace()
}
});
}

可以看出,putAsync在方法中多了一个回调处理,可以用来处理数据是否被保存到了磁盘上。



当然,除了保存单个的对象外,Reservoir支持保存一个集合。

private static final String PERSONS = "MUCH_PERSON";
    private void saveDatas() {
Person person1 = new Person("无缘1", 25, new Date(), true);
Person person2 = new Person("无缘2", 22, new Date(), false);
Person person3 = new Person("无缘3", 21, new Date(), true); List<Person> persons = new ArrayList<Person>();
persons.add(person1);
persons.add(person2);
persons.add(person3);
try {
Reservoir.put(PERSONS, persons);
} catch (Exception e) {
e.printStackTrace();
}
}

就这么简单,我们已经把一个List集合保存到了本地磁盘中,接下来,让我们看看,这些数据是以怎样的格式存储的。打开File
Explorer/data/data/package name/cache/Reservoir

没错,就是这几个文件,把它们导出来,打开看下,你会发现:

[{"name":"无缘1","birthday":"Aug 22, 2015 2:56:38 PM","age":25,"sex":true},{"name":"无缘2","birthday":"Aug 22, 2015 2:56:38 PM","age":22,"sex":false},{"name":"无缘3","birthday":"Aug 22, 2015 2:56:38 PM","age":21,"sex":true}]

没错,就是json格式,对象被序列化后,是以json格式保存在磁盘文件中的。

3.3
使用Reservoir提供的get、getAsync方法读取数据

数据既然可以存储在磁盘上,当然可以读取啦,这是毋庸置疑的。

与Reservoir提供的put方法对应,它也提供了get方法,来读取数据。

顾名思义,Reservoir通过get及getAsync两个方法,可以读取磁盘中的文件。

让我们看看代码示例:

    private void readData() {
try {
if (Reservoir.contains(PERSON)) {
System.out.println(Reservoir.get(PERSON, Person.class));
;
}
} catch (Exception e) {
e.printStackTrace();
}
}

程序输出:Person{name='无缘', age=25, birthday=Sat Aug 22 15:09:16 GMT 2015, sex=true}

接下来,仔细看下上述代码,注释的部分,你会发现,我们先进行了一步判断,这是必须要进行的一步,因为如果你不进行判断的话,可能会出现key不存在情况,继而会引发空指向异常

是吧,这更说明了上述进行contains key判断的必要性。

当然,我们还可以取出集合数据:

    private void readDatas() {
try {
if (Reservoir.contains(PERSONS)) {
List persons = Reservoir.get(PERSONS, List.class);
for (int i = 0; i < persons.size(); i++) {
System.out.println(persons.get(i));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

有个地方需要注意的是,我们取出集合数据是,是直接把它赋值给List,而不是List<Person>,这说明了,取出来的数据,已经失去了泛型(即泛型擦除)。不信么,那你看看:

   private void readDatas() {
try {
if (Reservoir.contains(PERSONS)) {
List<Person> persons = Reservoir.get(PERSONS, List.class);
// for (int i = 0; i < persons.size(); i++) {
// System.out.println(persons.get(i));
// }
for (Person person : persons) {
System.out.println(person);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

运行:

很明显,类型转换异常,我们无法把List强转为Person,那如果我需要List<Person>集合该怎么办呢?好办,使用Type呗:

    private void readDatas() {
try {
if (Reservoir.contains(PERSONS)) {
Type resultType = new TypeToken<List<Person>>() {
}.getType();
try {
List<Person> persons = Reservoir.get(PERSONS, resultType);
for (Person person : persons) {
System.out.println(person);
}
} catch (Exception e) {
//failure
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

再运行,看输出:

08-22 15:22:27.077  32747-32747/com.lnyp.reservoir I/System.out﹕ Person{name='无缘1', age=25, birthday=Sat Aug 22 15:18:56 GMT 2015, sex=true}
08-22 15:22:27.077 32747-32747/com.lnyp.reservoir I/System.out﹕ Person{name='无缘2', age=22, birthday=Sat Aug 22 15:18:56 GMT 2015, sex=false}
08-22 15:22:27.077 32747-32747/com.lnyp.reservoir I/System.out﹕ Person{name='无缘3', age=21, birthday=Sat Aug 22 15:18:56 GMT 2015, sex=true}

3.4 使用Reservoir提供的delete、clear方法删除和情况缓存数据

当我们需要删除,或者是直接清空本地磁盘缓存时,Reservoir也给提供了非常简单的方法:

3.4.1 删除key值为PERSON的数据缓存:

    private void deleteData() {
try {
if (Reservoir.contains(PERSON)) {
Reservoir.delete(PERSON);
}
} catch (Exception e) {
e.printStackTrace();
}
}

3.4.2 清空本地所有的缓存:

    private void clearData() {
try {
Reservoir.clear();
} catch (Exception e) {
e.printStackTrace();
}
}

就是这么简单,就是这么任性,简单,好使,这就是Reservoir。

四: 总结

通过上文的介绍,大家该知道Reservoir是多么的好用了吧,没错,简单好使,这是它给我最直接的印象。更多的介绍,可以去看下Reservoir
的源代码。

Reservoir gitub地址:https://github.com/anupcowkur/Reservoir

上述示例源码下载地址:http://download.csdn.net/detail/zuiwuyuan/9036747

Android本地数据存储: Reservoir的更多相关文章

  1. Android本地数据存储: ASimpleCache

    一:前言 在上一篇博客Android本地数据存储: Reservoir 博客中,我提到,除了Reservoir库,还可以采用ASimpleCache开源库,来实现本地数据存储.昨天并没有仔细的对比Re ...

  2. Android本地数据存储复习

    Android本地数据存储复习 Android无论是应用层还是系统层都需要在本地保存一些数据,尤其在应用层中使用的就更为普遍,大体有这么几种:SharedPreference,file,sqlite数 ...

  3. 理解 Android 本地数据存储 API

    利用首选项.SQLite 和内部及外部内存 API 对于需要跨应用程序执行期间或生命期而维护重要信息的应用程序来说,能够在移动设备上本地存储数据是一种非常关键的功能.作为一名开发人员,您经常需要存储诸 ...

  4. Android本地数据存储之SQLite关系型数据库 ——SQLiteDatabase

    数据库的创建,获取,执行sql语句: 框架搭建:dao 思考: 1.数据库保存在哪里? 2.如何创建数据库?如何创建表? 3.如何更新数据库?如何更改表的列数据? 4.如何获取数据库? 5.如何修改数 ...

  5. [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  6. Android之ListView,AsyncTask,GridView,CardView,本地数据存储,SQLite数据库

    版权声明:未经博主允许不得转载 补充 补充上一节,使用ListView是用来显示列表项的,使用ListView需要两个xml文件,一个是列表布局,一个是单个列表项的布局.如我们要在要显示系统所有app ...

  7. android学习笔记45——android的数据存储和IO

    android的数据存储和IO SharedPreferences与Editor简介 SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此其保存的数据主要是简单的类型的ke ...

  8. Android实现数据存储技术

    转载:Android实现数据存储技术 本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用Shar ...

  9. Android中数据存储(一)

    国庆没有给国家添堵,没有勾搭妹子,乖乖的写着自己的博客..... 本文将为大家介绍Android中数据存储的五种方式,数据存储可是非常重要的知识哦. 一,文件存储数据 ①在ROM存储数据 关于在ROM ...

随机推荐

  1. MySQL ODBC驱动安装和配置数据源

    一.MySQL的ODBC驱动下载及安装 步骤一:下载ODBC驱动安装包 1.下载地址: https://dev.mysql.com/downloads/connector/odbc/ 2.选择适合自己 ...

  2. chrome 浏览器 添加访问助手来访问网上应用商店

    chrome浏览器的强大之处,在于可以chrome浏览器的扩展程序来实现很多功能.然而不能下载扩展程序.可以借助chrome访问助手来实现: 下载chrome访问助手:https://pan.baid ...

  3. 阿里云CDN边缘脚本EdgeScript公测:简单语法完成CDN复杂配置

    CDN可以将源站内容分发至最靠近用户侧的节点,使得用户就近获取内容,提高用户的访问成功率和效率.作为CDN运维工程师,他的日常工作就是通过CDN系统的配置和管理,来确保CDN业务正常运转,以此来保障网 ...

  4. CMake学习笔记四-CMake常用命令

    CMake常用命令 PROJECT PROJECT(projectname [CXX] [C] [Java]) 指定工程名称,并可指定工程支持的语言.支持语言列表可忽略,默认支持所有语言 SET ...

  5. Servlet表单处理

    HttpServletRequest   继承ServletRequest  HttpServletRequest生命周期: 一个HttpServletRequest对象在用户向web服务器发送请求时 ...

  6. 【JZOJ4743】【NOIP2016提高A组模拟9.2】积木

    题目描述 输入 输出 样例输入 3 8 7 6 3 9 4 1 10 5 输出 18 数据范围 样例解释 解法 容易从n<=15得出可以使用状态压缩动态规划. 设f[i][j][k]表示01状态 ...

  7. 介绍elasticsearch的文件

    elasticsearch.yml文件 打开上边的文件,我们看到下面的"集群"名称,节点名称 下图是文件的存储路径和日志路径 下面是监听的地址,默认是本机 下图指的是,集群是怎样搭 ...

  8. mac os 使用记录

    折腾过一台黑苹果,配置很菜,奔腾G3260和B150M-D2V,具体EFI和配置详见repo Hackintosh 首先要解决的就是写代码问题,mac进行acm(C/C++)编程 VS code天下第 ...

  9. Directx11教程(4) 一个最基本D3D应用程序(2)

    原文:Directx11教程(4) 一个最基本D3D应用程序(2) 接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲 ...

  10. ajax请求 400 Bad Request, 然后就没进后台方法!

    原因可能是 ajax提交表单的data中实体的字段没有值(表单中无值填充的问题) 导致前台就已经报错了! 需要注意的字段类型 double  date  int .. 我就是因为这个double  , ...