Android数据库高手秘籍(九),赶快使用LitePal 2.0版本吧
# 前言
今天很高兴告诉大家一个好消息,LitePal 又出新版本了。
算了一下,上个版本 1.6.1 已经是半年前推出的了,而整个开源项目自 2014 年推出以来,我已经维护了有四年之久。这四年以来,我不断地完善着 LitePal 的代码,修复各种大家提出的 bug,以及补充各式各样好用的新功能。而今天,时隔半年,LitePal 终于迎来了一次大的版本更新,正式发布了 2.0.0 版本!
从 1.6.1 直接跨越到 2.0.0,说明这次的升级变化还是非常大的。在 2.0.0 版本当中,我重构了内部大量的代码,使得 LitePal 整体的架构更加合理和清晰,API 接口更加科学,并且重写了数据库的同步处理机制,解决了很多并发操作数据库的问题。最重要的是,LitePal 2.0.0 版本现在全面支持 Kotlin 了!以后不管你是用 Java 还是 Kotlin 开发 Android 程序,都可以 100% 兼容地使用 LitePal,是不是有点小激动呢?那么下面我们就来具体学习一下如何使用新版本的 LitePal 吧。
# 升级的方式
升级的方式很简单,如果你使用的是 Android Studio,只需要在 build.gradle 中修改一下配置即可:
dependencies {
implementation 'org.litepal.android:core:2.0.0'
}
复制代码
2
3
4
5
如果你使用的还是 Eclipse,那么可以点击 这里 (opens new window) 下载最新版的 jar 包。
需要大家注意的是,2.0.0 版本中几乎所有的 API 接口全部都变了。但是请不要惊慌,2.0.0 版本是完全向下兼容的,也就是说,大家不用担心升级之后会出现大量的错误,之前所有的代码都还是可以正常运行的,只是原来旧的 API 会被标识为废弃,提醒大家尽快使用新的 API 而已,如下图所示:
当然,大家也不用一听到所有的 API 都变了就觉得恐慌,其实一切的变更都是有规律可循的。
那么我们都知道,LitePal 本身的用法就非常简单,因此升级新 API 的过程也同样是非常简单的,下面我们一步步来看。
首先是实体类的继承要进行修改,这是我们过去的写法:
可以看到,现在 DataSupport 类已经被标为了废弃,虽然暂时还可以正常工作,但是不建议再继续使用了,从 LitePal 2.0.0 版本开始建议使用 LitePalSupport 类,我们将代码改成如下所示即可:
将实体类的继承结构更改为 LitePalSupport 之后,得到的一个隐形好处就是所有的实例 CRUD 方法都会自动升级到 2.0.0 版本了,如 save() 方法,update() 方法,delete() 方法等等。因此,我们原来存储一条数据该怎么写,现在就还怎么写,比如:
Song song = new Song();
song.setName("hello");
song.setDuration("180");
song.save();
复制代码
2
3
4
5
6
这样就可以存储一条数据到数据库当中了,和之前的写法没有任何变化,但是却使用了 LitePal 2.0.0 中的最新接口了,因为这个 save() 方法是来自于 LitePalSupport 类的。
接下来第二步需要升级的是静态 CRUD 方法。原来所有的静态 CRUD 方法都是封装在 DataSupport 类当中的,比如刚才我们演示过的查询数据库的中数据可以这么写:
而现在,所有的静态 CRUD 方法都被移动到了 LitePal 类当中,因此我们只需要将 DataSupport 修改为 LitePal 即可,其他的用法都是完全不变的,如下所示:
没错,升级过程就是这么简单。总结一下其实主要就只有两点,如果你是在继承结构中使用了 DataSupport,那么就将它改为 LitePalSupport,如果你是调用了 DataSupport 中的静态方法,那么就将它改为 LitePal。
不过最后还有一件事需要注意,如果你的项目代码启用了混淆,那么混淆的配置也需要进行相应的修改才行,原来的混淆配置如下所示:
-keep class org.litepal.** {
*;
}
-keep class * extends org.litepal.crud.DataSupport {
*;
}
复制代码
2
3
4
5
6
7
8
9
而由于 DataSupport 类已经被废弃了,因此这里也需要将混淆文件中的 DataSupport 改成 LitePalSupport 才行,如下所示:
-keep class org.litepal.** {
*;
}
-keep class * extends org.litepal.crud.LitePalSupport{
*;
}
复制代码
2
3
4
5
6
7
8
9
将以上的操作都完成之后,那么恭喜你,你的代码已经完全升级到 LitePal 2.0.0 版本了。
Kotlin 自去年 Google IO 大会成为 Android 一级语言之后,经过了一年多的发展,如今已经正式成为 Google 心中的亲儿子了。未来使用 Kotlin 编写 Android 程序的人会越来越多,因此 LitePal 也及时跟进,全面支持了 Kotlin 语言。
下面我来给大家简单演示下如何在 Kotlin 代码中使用 LitePal 吧。
# LitePal的使用 方法
首先要定义一个实体类,这里我们就以 Book 类为例吧。比如 Book 类中有 id、name、page 这三个字段,并且继承自 LitePalSupport 类,如下所示:
class Book(val name: String, val page: Int) : LitePalSupport() {
val id: Long = 0
}
复制代码
2
3
4
5
可以看到,Kotlin 中定义实体类真的是非常简单。需要注意的是,如果你的实体类中需要定义 id 这个字段,不要把它放到构造函数当中,因为 id 的值是由 LitePal 自动赋值的,而不应该由用户来指定。因此这里我们在 Book 类的内部声明了一个只读类型的 id。
然后需要在 litepal.xml 中声明一下这个实体类,这个属于常规操作了:
<list>
<mapping class="org.litepal.litepalsample.model.Book" />
</list>
复制代码
2
3
4
5
好了!接下来我们就可以进行 CRUD 操作了,那么由于是首次使用 Kotlin 来操作 LitePal,这里我会将每一个操作都分别演示一下。首先是存储操作,代码如下所示:
val book = Book("第一行代码", 552)
val result = book.save()
Log.d(TAG, "save result is $result , book id is ${book.id}")
复制代码
2
3
4
5
可以看到,这里我们先创建了一个 Book 的实例,并传入书名和页数,然后调用 save() 方法就可以将这条数据存储到数据库中了。存储结束后这里还用一条打印日志打印出了执行结果,如下所示:
D/MainActivity: save result is true , book id is 1
复制代码
2
3
可以看到,这里显示存储成功,并且 book 的 id 值变成了 1,说明 LitePal 在存储成功之后自动给 id 赋值了。
接下来我们到数据库中具体查看一下吧,如下图所示:
再一次验证存储操作已经成功了。
接下来我们演示一下修改操作,代码如下所示:
val cv = ContentValues()
cv.put("name", "第二行代码")
cv.put("page", 570)
LitePal.update(Book::class.java, cv, 1)
复制代码
2
3
4
5
6
其实基本上 Kotlin 上的用法大家都会觉得眼熟,因为和 Java 都是类似的,只是具体语法可能有些不太一样。就比如 update() 方法接收的第一个参数是个 Class 对象,在 Java 中我们会传入 Book.class,而在 Kotlin 中则需要传入 Book::class.java。
执行上述代码,然后再到数据库中查看一下,结果如下图所示:
没错,说明我们的修改操作也顺利完成了。
下面看一下删除操作,代码如下所示:
LitePal.delete(Book::class.java, 1)
复制代码
2
3
这里我们指明要删除 id 为 1 的这条记录。当然除了按照 id 删除以外,你还可以按照其他任意条件去删除,比如我们想把页数大于 500 的书全部都删掉,那么就可以这么写:
LitePal.deleteAll(Book::class.java, "page > ?", "500")
复制代码
2
3
好,现在执行上述任意一行代码,然后到数据库中观察一下,如下图所示:
没有问题,可以看到这里数据库已清空,说明我们的删除操作确实生效了。
最后,再向大家演示一下查询的操作。由于现在数据库中已没有数据可查,那么我们先向库中添加两条数据,然后再执行查询操作,代码如下所示:
Book("第一行代码", 552).save()
Book("第二行代码", 570).save()
LitePal.findAll(Book::class.java).forEach {
Log.d(TAG, "book name is ${it.name} , book page is ${it.page}")
}
复制代码
2
3
4
5
6
7
8
这里调用了 findAll() 方法,将 Book 表中的所有数据都查询了出来。查询的结果是一个 List 集合,因此我们又用了 Kotlin 中的 forEach 循环将查询到的每条记录都打印了出来。执行结果如下所示:
D/MainActivity: book name is 第一行代码 , book page is 552
D/MainActivity: book name is 第二行代码 , book page is 570
复制代码
2
3
4
当然,除了调用 findAll() 方法之外,我们还可以使用 LitePal 的连缀查询来对查询条件进行任意地定制:
LitePal.where("name like ?", "第_行代码")
.order("page desc")
.limit(5)
.find(Book::class.java)
复制代码
2
3
4
5
6
这样我们就将在 Kotlin 中使用 LitePal 进行 CRUD 操作全部都演示完了,是不是感觉和 Java 中一样的简单和方便呢?当然,除了这些新功能之外,我还修复了一些已知的 bug,提升了整体框架的稳定性,如果这些正是你所需要的话,那就赶快升级吧。
作者:郭霖 链接:https://juejin.cn/post/6997612067255484446 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。