一:前言

今天做项目,准备使用本地存储,把一些数据存在本地磁盘上,比如用户名、密码这样的。其实大家都知道,这种情况最常用的就是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;}@Overridepublic 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() {@Overridepublic void onSuccess() {System.out.println("success");}@Overridepublic 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 储存方案,Android本地数据存储方案(一)

    Android系列的博客主要是记录和总结自己在平时学习之中遇到的问题,方便日后用到时查看,同时也希望对读者有所帮助.不足之处,欢迎指正~ 在说到Android数据存储之前,先提一下数据持久化,所谓数据 ...

  2. Android的数据存储之一------SharedPreferences

    下面将介绍下Android的数据存储,Android提供了5种方式存储数据: 1.SharedPreferences存储数据; 2.文件存储数据: 3.SQLite数据库存储数据: 4.使用Conte ...

  3. android app数据存储,基于Android开发的APP数据存储研究

    谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...

  4. Windows 8 应用开发 - 本地数据存储

    原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下面将通过一 ...

  5. android SharedPreferences数据存储

    android  SharedPreferences数据存储 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存 ...

  6. 005 Android之数据存储

    文章目录 Android文件系统 Android文件的访问权限 文件访问权限实例 数据存储方式 内部存储 内部存储实例 外部存储 Shared Preferences Shared Preferenc ...

  7. iOS APP之本地数据存储(译)

    最近工作中完成了项目的用户信息本地存储,查阅了一些本地存储加密方法等相关资料.期间发现了一个来自印度理工学院(IIT)的信息安全工程师的个人博客,写了大量有关iOS Application secur ...

  8. 白鹭本地数据存储操作代码实例

    白鹭引擎 版本:5.2.8 描述:白鹭本地数据存储操作代码实例 本地数据的增删改查函数 /*** 数据存储函数*/private save_key(key_name:string,key_value: ...

  9. android常用的存储方式,Android 常见数据存储方式

    Android 常见数据存储方式有以下三种:1.使用SharedPreferences存储数据:其本质就是一个xml文件,可以保存字符串.布尔值.基础数据.集合等数据.常用于存储较简单的参数设置. 2 ...

最新文章

  1. 谷歌不更新android studio,彻底迈向64位:谷歌宣布 Android Studio 将停止 32 位版本更新...
  2. nand flash 扇区的管理以及初始化
  3. c语言实现排列组合:实现matlab中的nchoosek函数
  4. 30岁学python编程_朋友问我,你都30岁了学编程来得及吗
  5. select设置默认文字,不出现在下拉框中
  6. C 指针常量 和常量指针 指向常量的指针常量的使用
  7. ASP.NET Core 程序发布到Linux(Centos7)爬坑实战
  8. java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里
  9. mybatis获取表名_mybatis plus 的动态表名的配置详解
  10. 【Django 2021年最新版教程20】python for循环遍历queryset
  11. Python入门之面向对象module,library,package之间区别
  12. Android自动化测试(UiAutomator)简要介绍 - 萧瑟一笑的专栏 - 博客频道 - CSDN.NET...
  13. Windows开发签名工具(SignTool)下载
  14. 2014程序化购买元年-芒果移动广告-王江
  15. kettle-spoon安装
  16. 练习 P1957 口算练习题
  17. UltraCompare比较文件时出现UTF8_ConvertorForMac无转换符号!
  18. c语言解除键盘锁定,解除键盘锁定,详细教您笔记本解除键盘锁定
  19. 芯片封装形式(网上到处找的)
  20. django1.8下的markdown、highlight、pagedown解决

热门文章

  1. x64dbg软件比OD更好的工具
  2. 智能合约:从 Python 调用智能合约
  3. CPU Designer
  4. matlab产生带通白噪声,理想白噪声和带限白噪声的产生与分析
  5. python 之禅_Python之禅
  6. 好口才是练出来的:练胆量、练技巧、练修养
  7. QML 使用资源系统
  8. linux性能优化实战 倪朋飞,Linux性能优化实战:系统的swap变高(09)
  9. Unity材质球个人学习笔记
  10. 美国访问学者J1签证申请攻略