打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LitePal 1.5.0版本发布,你想要的都在这里

写在前面

今天很高兴地告诉大家,LitePal又出新版本了!

其实我在2012年开始筹备做这个开源项目的时候,我自己也没想到会做多久,维护多久。现在回头想确实觉得蛮不可思议的,已经过去五年时间了,而我还在一直维护着这个项目,不断开发着新功能,不断修复着bug。

前几天,群里的高叔问我是不是又在开发LitePal的新功能了,我说是的,你怎么知道?他说看到我刚刚在GitHub上又提交代码了。

然后他发了一张截图给我:

他说他看到LitePal最早的提交记录已经是三年前了,真心佩服我能将一个项目维护三年之久,他用过的很多开源项目都是很久之前就不再更新了。

如果他没有截这张图,我自己都没意识到时间已经过去这么久了。确实,好像我这个人做事的风格就一贯如此。写博客也是,从2013年3月开始写第一篇博客,到现在已经过去四年了,而我还在坚持写着。公众号也是,从去年五月份开始正式运营以来,一直保持着每个工作日一篇技术文章的推送,雷打不动。好像我做什么事情,只要认定是对的,就会坚持下去。这应该是一种好的品质吧,也希望我未来能继续保持下去。

那么回到正题,LitePal已经推出那么多个版本了,也是帮助了很多朋友解决了在Android上数据库开发的难题。在开发过程中,也是感谢大家给了我很多的建议,这些建议使得我能开发出更加好用的LitePal版本。

而这次的1.5.0版本中,最主要的两大功能都是来自于大家给我的建议,下面就让我们一起来看一下1.5.0版本中到底有什么强大的功能吧。

异步操作数据库

支持异步操作数据库是LitePal 1.5.0版本的核心功能。在这之前,使用LitePal操作数据库默认都是在主线程进行的,如果你想在子线程中进行数据库操作则需要自己创建线程才行。

事实上,Android官方是建议将所有的数据库操作都放在子线程中进行的。但是我们大多数情况下可能都不会这么做,因为数据库操作一般都很快,即使在主线程中执行也基本不会影响到界面元素。因此,LitePal之前的版本中也是一直都没有加入异步操作数据库这个功能。

但是凡事都有例外,如果你需要对大量的数据进行操作,比如从数据库中读取几千甚至上万条记录,这个时候如果还放在主线程中操作显然就不是一个明智的选择,因此异步操作数据库还是有它适用的场景的。

也是听了很多朋友的建议,于是我开始设计异步操作数据库这个功能。在设计的时候,我要充分考虑到它的易用性,因为我希望可以让原本就已经了解LitePal用法的开发者们立即就能上手这个新功能,而不需要付出什么额外的学习成本。

经过了长时间的思考,我给LitePal中所有的CRUD方法都加入了一个Async的副本方法。什么意思呢?比如说原来有一个find()方法,现在就会多出一个findAsycn()方法,原来有一个save()方法,现在就会多出一个saveAsync()方法。如果你想要进行异步数据库操作的时候,只要去调用原API相对应的Async副本方法就可以了。

但是由于异步操作的内部会开启线程,因此这类方法都是无法返回值的,那么异步操作的结果就只能依靠回调来完成。所以,我又给每一个Async副本方法的后面添加了一个listen()方法,专门用于监听异步操作的结果。

那么,比如说我们想要将Album对象异步存储到数据库当中,就可以这么写:

Album album = new Album();album.setName('album');album.setPrice(10.99f);album.setCover(getCoverImageBytes());album.saveAsync().listen(new SaveCallback() {
   @Override    public void onFinish(boolean success) {    }});

使用上述写法,整个Album对象的save过程都会在子线程中执行,最终存储的结果会回调到onFinish()方法当中。

当然,仅仅存储一条记录确实没有太大的必要去进行异步操作,不过如果你要一次性存储10000条记录,那么就很有必要这么写了:

List albumList = new ArrayList<>();
for (int i = 0; i 10000; i++) {
   Album album = new Album();    album.setName(getName());    album.setPrice(getPrice());    albumList.add(album);}
DataSupport.saveAllAsync(albumList)
.listen(new SaveCallback() {
   @Override    public void onFinish(boolean success) {    }});

这里我们先用for循环组装了10000条记录,然后调用saveAllAsync()方法(saveAll()方法的Async副本)一次性进行存储。LitePal会在内部开启线程来去处理存储操作,完全不会阻塞主线程。你可以高枕无忧地在主线程上去处理任何其他事情,10000条记录都存储结束后,LitePal会将存储结果回调到onFinish()方法当中。

接下来我们再看一下异步查询的例子。查询某个表中的所有数据可以用findAll()方法,而现在album表中已经有10000条数据了,为了不阻塞主线程,我们需要进行异步查询才行:

DataSupport.findAllAsync(Album.class)
.listen(new FindMultiCallback() {
   
@Override    public void onFinish(List t) {
       
List allAlbums = (List) t;    }});

这里调用了findAll()方法的Async副本,也就是findAllAsyc()方法,并串接了一个listen()方法用于监听查询结果。需要注意的是,查询结果是使用泛型的方式回调到onFinish()方法中的,也就是说开发人员还需要自己做一次向下转型操作才行。

另外还有一点需要说明,虽然Async方法内部会开启子线程,但是所有异步操作回调到onFinish()方法之后都会切回到主线程。也就是说,大家可以直接在这里进行UI操作,弹出Toast提示等等,而不需要自己再进行一次线程切换了。这也是LitePal为了方便大家开发又做出的一些优化。

其他一些更新、删除的异步操作用法也是相同的,这里就不再一一阐述了,相信大家都可以手到擒来。

不存在就存储,已存在就更新

这个功能也是呼声很高的一个功能,已经数不清多少次有朋友问过我,该如何实现如果数据不存在就存储,已存在就更新这样的功能?LitePal中有没有这样的API?

LitePal之前是确实没有这样的API的,但实现这个功能我感觉并不复杂。其实只需要进行一次逻辑判断,然后根据判断的结果进行相应的逻辑处理就可以了。

比如我们组装了一个名叫小明的Person对象,然后需求是,如果表中已经存在小明这个人了,就更新他的数据,如果不存在,就将小明的数据插入到表中。

Person p = new Person();p.setName('小明');p.setAge(16);
List list = DataSupport
               .where('name=?', p.getName())
               .find(Person.class);
if (list.isEmpty()) {    p.save();} else {
   Person person = list.get(0);    person.setAge(p.getAge());    person.save();}

可以看到,这里我们先是通过LitePal的查询方法来查一下person表中是不是有小明这个人,如果没有的话,就将小明save到表中,如果有的话,就将表中的数据进行更新。

不过,即使我带着大家将逻辑梳理的很清楚了,不得不承认,上述代码依然很繁琐,LitePal之前确实是没有什么特别好的办法来处理这种需求。

不过从现在开始,这种需求就再也不是问题了。LitePal 1.5.0版本中新增了一个saveOrUpdate()方法,专门用来处理这种不存在就存储,已存在就更新的需求。

我们来看一下,上面的需求如果使用saveOrUpdate()方法该怎么写:

Person p = new Person();p.setName('小明');p.setAge(16);p.saveOrUpdate('name=?', p.getName());

没错,就是这么简单。调用saveOrUpdate()方法后,LitePal内部会自动判断,如果表中已经存在小明这条记录了,就会自动更新,如果不存在的话,就会自动插入。和刚才前面那段代码相比,省去了绝大部分繁琐的逻辑操作。

当然,这个新增的saveOrUpdate()方法也有它的Async副本哦。如果你想异步进行saveOrUpdate操作,那么只需要这样写就可以了:

Person p = new Person();p.setName('小明');p.setAge(16);p.saveOrUpdateAsync('name=?', p.getName())
.listen(new SaveCallback() {
   @Override    public void onFinish(boolean success) {    }});

好了,LitePal 1.5.0版本中最主要的两大新功能就介绍的差不多了。当然除了这两大功能之外,我还修复了一些已知的bug。如果你觉得这些新功能正是你所需要的话,那就赶快升级吧。

如何升级

升级方式一如既往的简单,如果你使用的是Android Studio,只需要在build.gradle中修改一下配置即可:

dependencies {    compile 'org.litepal.android:core:1.5.0'
}

1.5.0版本中的所有的功能都是向下兼容的,因此你的升级不用付出任何成本。

如果你使用的还是Eclipse,那么就需要到LitePal的项目主页去下载最新版的jar包了,项目主页地址是:

https://github.com/LitePalFramework/LitePal

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android数据库高手秘籍(十)
.net core 3.0 异步请求一直报404
Async异步编程简介
【5min+】帮我排个队,谢谢。await Task.Yield()
C#执行异步操作的几种方式比较和总结
 java8 <span style="background-color: rgb(43, 43, 43); color: rgb(169, 183, 198);
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服