Android初学之十七:使用LitePal操作数据库

一、LitePal简介

LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种表的建设和增删改查的操作。LitePal的项目主页上也有详细的使用文档,地址是:https://github.com/LitePalFramework/LitePal

二、配置LitePal

1、编辑app/build.gradle文件,在dependencies闭包中添加:
Android初学之十七:使用LitePal操作数据库_第1张图片
1.4.1是版本号的意思,最新版本号可以到LitePal官网上查看
2、还需要配置litepal.xml文件,右击app/src/main 目录 -NEW -Directory,创建一个assets目录,接着在assets目录下再新建一个litepal.xml文件,接着编辑该文件中的内容:
Android初学之十七:使用LitePal操作数据库_第2张图片
其中标签用于指定数据库名,标签用于指定数据库版本号,标签用于指定所有的映射模型
3、最后还需要配置一下LitePalApplication,修改清单文件的代码
Android初学之十七:使用LitePal操作数据库_第3张图片
这里我们将项目的application配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能都可以正常工作。
现在LitePal的配置工作已经完成。

三、创建和升级数据库

对象关系映射(ORM)模式:我们使用的编程语言是面向对象语言,而使用数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射。可以用面向对象的思维来操作数据库,而不用再和SQL语句打交道了。

1、定义一个Book类
Android初学之十七:使用LitePal操作数据库_第4张图片
2、将Book类添加到映射模型中,修改litepal.xml代码
Android初学之十七:使用LitePal操作数据库_第5张图片
这里使用标签来声明我们要配置的映射模型,注意一定要使用完整的类名,不管有多少模型类需要映射,都是使用同样的方式配置在标签下即可
3、现在只要执行一次数据库的操作,BookStore.db数据库就会自动创建出来,添加一个创建数据库的按钮:
Android初学之十七:使用LitePal操作数据库_第6张图片

比如我们想要想Book表添加一个press(出版社)列,直接修改Book类中的代码,添加一个press字段即可,
Android初学之十七:使用LitePal操作数据库_第7张图片

与此同时,我们还想要添加一张Category表,那么只需要新建一个Category类就可以了:
Android初学之十七:使用LitePal操作数据库_第8张图片

改完了所有我们想改的东西,只需要将版本号加1就行了,由于这里还添加了一个新的模型,因此也需要将它添加到映射模型列表当中,修改litepal.xml代码:
Android初学之十七:使用LitePal操作数据库_第9张图片
这样就完成啦!

四、使用LitePal添加数据

1、LitePal进行表管理操作时不需要模型类有任何的继承结构,但是进行CRUD操作时就不行了,必须要继承自DataSupprt类才行,因此我们需要先把继承结构给加上,修改Book类中的代码:
Android初学之十七:使用LitePal操作数据库_第10张图片
2、接着我们向Book表中添加数据,新建一个添加数据按钮:
Android初学之十七:使用LitePal操作数据库_第11张图片

五、使用LitePal更新数据

1、最简单的一种更新方式就是对已存储的对象重新设置,然后重新调用save()方法即可。
2、对于LitePal来说,对象是否存储就是根据调用model.isSaved()方法的结果来判断的,返回true就表示已存储,返回false就表示未存储,那么接下来的问题就是,什么情况下会返回true,什么情况会返回false呢?

有两种情况下model.isSaved()方法才返回true,一种情况是已经调用过model.save()方法去添加数据了,此时model会被认为是已存储的对象,另一种情况是model对象是通过LitePal提供的查询API查出来的,由于是从数据库中查到的对象,因此也会被认为是已存储的对象。

示例:更新书名的价格,新建一个更新按钮:

Android初学之十七:使用LitePal操作数据库_第12张图片

不过,在使用updateAll()方法时,还有一 个非常重要的知识点是你需要知晓的, 就是当你想把一个字段的值更新成默认值时,是不可以使用上面的方式来set数据的。我们都知道,在Java中任何一 种数据类型的字段都会有认值,例如int类型的默认值是0,boolean类型的默认值是false, String 类型的默认值是null。那么当new出一个Book对象时,其实所有字段都已经被初识化成默认值了,比如说pages字段的值就是0。因此,如果我们想把数据库表中的pages列更新成0,直接调用book. setPages (0)是不可以的,因为即使不调用这行代码,pages字段本身也是0, LitePal 此时是不会对这个列进行更新的。
对于所有想要将为数据更新成默认值的操作,LitePal 统一提供了个setToDefault()方法, 然后传人相应的列名就可以实现了。 比如我们可以这样写:
Book book = new Book();
book. setToDefault(“pages”);
book. updateAll();
这段代码的意思是,将所有书的页数都更新为0.因为updateAll()方法中没有指定约束条件,因此更新操作对所有数据都生效了。

六、使用LitePal删除数据

使用LiePal 删除数据的方式主要有两种,第一种比较简单,
就是直接调用已存储对象的delete()方法就可以了,对于已存储对象的概念,我们在上一一小节中已经学习过了。也就是说,调用过save()方法的对象,或者是通过LitePal提供的查询API查出来的对象,都是可以直接使用delete()方法来删除数据的。这种方式比较简单,我们就不进行代码演示了,下 面直接来看另外种删除数据的方式。

示例:删除Book表中价格低于200块的数据,新建一个按钮:
Android初学之十七:使用LitePal操作数据库_第13张图片

七、使用LitePal查询数据

示例:查询Book表中的所有信息
Android初学之十七:使用LitePal操作数据库_第14张图片

除了findAl()方法之外,LitePal还提供了很多其他非常有用的查询API。
1、比如我们想要查询Book表中的第一 条数据就可以这样写:
Book firstBook = DataSupport. findFirst (Book.class);
2、查询Book表中的最后一条数据 就可以这样写:
Book lastBook = DataSupport. findLast (Book.class);
3、我们还可以通过连缀查询来定制更多的查询功能。
(1)、select()方法用于指定查询哪几列的数据,对应了SQL当中的select关键字。比如只查name和author这两列的数据,就可以这样写:
ListeBook> books = Datasupport. select(“name”, “author” ).find(Book.class);
(2)、where方法用于指定在询的约束条件,对应了sQL当中的where关键字。比如只查百
数大于400的数据,就可以这样写:
List-oo bs = Dasupprt .where( "ages> ?”, “00no.k.chas
(3)、order()方法用于指定结果的排序方式,对应了sQL当中的order by关键字。比如将查询结果按照书价从高到低排序,就可以这样写:
List books = DataSupport . order(“price desc”). find(Book.class);
其中desc表示降序排列,asc 或者不写表示升序排列。
(4)、limit()方法用于指定查询结果的数量,比如只查表中的前3条数据,就可以这样写:
List books = DataSupport. limit(3). find(Book. class);
(5)、offet()方法用于指定查询结果的偏移量,比如查询表中的第2条、第3条、第4条数据,就可以这样写:
List books = Datasupport.
由于limit(3)查询到的是前3条数据,这里我们再加上offset(1)进行一个位置的偏移,就能实现查询第2条、第3条、第4条数据的功能了。Limit()和ffset()方法共同对应了SQL当中的limit关键字。
(6)、当然,你还可以对这5个方法进行任意的连缀组合,来完成一个比较复杂的查询操作:

List<Book> books = Datasupport. select("name", "author", "pages")
.where("pages > ?",“400")
,order(" pages")
.limit(10)
.offset(10)find ( Book.class);

这段代码就表示,查询Book表中第11~20 条满足页数大于400这个条件的name、author和pages这3列数据,并将查询结果按照页数升序排列。

当前,如果你实在有一些特殊需求,上述的API都满足不了你的时候,LitePal 仍然 支持使用原生的SQL来进行查询:
Cursor c = DataSupport. findBySQL(“select * from Book where pages > ? and price < ?” “400”,“20”) ;
调用DataSupport.findBySQL()方法来进行原生查询,其中第一个参数用于指定SQL语句,后面的参数用于指定占位符的值。注意findBySQL()方法返回的是一个Cursor对象,接下
来你还需要通过之前所学的老方式将数据一取出才行。

根据郭霖大神的第一行代码学习,敬礼!

你可能感兴趣的:(android,数据库,sqlite)