Android中数据库开发之LitePal的基本用法
LitePal是一款开源的Android数据库框架,采用对象关系映射(ORM)模式,将常用的数据库功能进行封装,这样不用写一行SQL语句就可以完成创建表、以及增删改查的操作啦。并且很轻量级,jar包不到100k,几乎零配置。
根据LitePal数据类型支持,可进行对象映射的数据一共有8种,int、short、long、float、double、boolean、String、Date。只要是声明这几种数据类型都会被自动映射到数据库表中,并且配置简单易懂。
LitePal的快速配置
1. 引入Jar包或源码
jar包下载地址:https://github.com/LitePalFramework/LitePal/tree/master/downloads
也可以使用Android Studio在项目的build.gradle中添加:
dependencies {
compile 'org.litepal.android:core:1.5.1'
}
2. 在project下main下创建assets配置litepal.xml
在项目的assets目录下面新建一个litepal.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--数据库名-->
<dbname value="BookStore"></dbname>
<!--数据库版本号,如果修改bean类了,可以修改版本号,这样,之前数据库中的数据也能得到保存-->
<version value="1"></version>
<!--映射模型,注意一定要使用完整的类名,可以多个映射-->
<list>
<mapping class="com.deepreality.litepaltestdemo.Book"></mapping>
</list>
</litepal>
3. 配置LitePalApplication
在AndroidManifest.xml中配置LitePalApplication,如下:
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>
如果已经有自己的Application,那么久继承一下就好了,如下:
public class MyOwnApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LitePal.initialize(this);
}
...
}
4. LitePal的建表
根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),建表先要新建一个模型类,新建一个DEST类,如下:
//必须继承DataSupport
public class DEST extends DataSupport {
private String destId;//目的地ID
private String cnName;//中文名
private String enName;//英文名
private String parentId;
private String childrenId;
private long updateTime;
// 自动生成get、set方法
}
LitePal增删改查操作
1.存储操作:
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
Song song1 = new Song();
song1.setName("song1");
song1.setDuration(320);
song1.setAlbum(album);
song1.save();
Song song2 = new Song();
song2.setName("song2");
song2.setDuration(356);
song2.setAlbum(album);
song2.save();
并且save()操作是有返回值的,所以可以这样:
if (mDest.save()) {
Toast.makeText(context, "存储成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "存储失败", Toast.LENGTH_SHORT).show();
}
2、删除操作
2.1、清空Book表所有数据:
DataSupport.deleteAll(DEST.class);
2.2、删除DEST表中id为2的记录,就可以这样写
DataSupport.delete(Song.class, 2);
2、修改操作
如果想把DEST表中id为4的destId改为"1",可以这样写:
DEST updateNews = new DEST();
updateNews.setDestId("1");
updateNews.update(4);
如果想把DEST表中所有destId为"1"的改为"2"可以这样写:
DEST updateNews = new DEST();
updateNews.setdestId("2");
updateNews.updateAll("destId = ?", "1");
4、查询操作
//查询操作
//查询一条数据,知道id
//Book book = DataSupport.find(Book.class, 1);
//查询第一条数据
//Book book = DataSupport.findFirst(Book.class);
//查询最后一条数据
//Book book = DataSupport.findLast(Book.class);
//查询数据集合
//知道id的情况下
/*long[] ids = new long[] { 1, 3, 5, 7 };
List<Book> bookList = DataSupport.findAll(Book.class, ids);*/
//不知道id的情况下
//聚合查询
//select:选择哪几列显示;limit:选择前几个数据;offset:偏移量,用于翻页时数据获取。
List<Book> bookList = DataSupport.select("name", "author")
.where("pages > ?", "100")
.order("price desc").limit(10).offset(10)
.find(Book.class);
至此,LitePal的增、删、改、查基本用法介绍完毕。
使用LitePal的聚合函数
LitePal中一共提供了count()、sum()、average()、max()和min()这五种聚合函数,基本上已经将SQL语句当中最常用的几种聚合函数都覆盖了,那么下面我们就来对这五种聚合函数的用法一一进行学习。
count()
count()方法主要是用于统计行数的,刚才演示了如何通过SQL语句来统计news表中一共有多少行,那么下面我们来看一下如何通过LitePal来实现同样的功能,代码如下所示:
int result = DataSupport.count(News.class);
你没有看错!就是这样一行代码就可以了。调用DataSupport类当中的count()方法,count()方法接收一个Class参数,用于指定去统计哪张表当中的数据,然后返回值是一个整型数据,也就是统计出的结果了。
除此之外,LitePal中所有的聚合函数都是支持连缀的,也就是说我们可以在统计的时候加入条件语句。比如说想要统计一共有多少条新闻是零评论的,就可以这样写:
int result = DataSupport.where("commentcount = ?", "0").count(News.class);
这个用法和我们在上一篇文章当中学到的连缀查询是比较像的,在DataSupport类中首先指定一个where语句用于条件约束,然后连缀一个count()方法,这样统计出的就是满足条件语句的结果了。连缀不仅适用于count()方法,也同样适用于下面我们将要介绍的所有方法,但由于用法都是相同的,后面就不再重复介绍了。
sum()
看完了count()方法应该是觉得非常简单吧,剩下的几个聚合函数也是同样简单的,我们继续来学习一下。
sum()方法主要是用于对结果进行求合的,比如说我们想要统计news表中评论的总数量,就可以这样写:
int result = DataSupport.sum(News.class, "commentcount", int.class);
sum()方法的参数要稍微多一点,我们来一一看下。第一个参数很简单,还是传入的Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望对哪一个列中的数据进行求合。第三个参数用于指定结果的类型,这里我们指定成int型,因此返回结果也是int型。
需要注意的是,sum()方法只能对具有运算能力的列进行求合,比如说整型列或者浮点型列,如果你传入一个字符串类型的列去求合,肯定是得不到任何结果的,这时只会返回一个0作为结果。
average()
average()方法主要是用于统计平均数的,比如说我们想要统计news表中平均每条新闻有多少评论,就可以这样写:
double result = DataSupport.average(News.class, "commentcount");
其中average()方法接收两个参数,第一个参数不用说,仍然是Class。第二个参数用于指定列名的,表示我们想要统计哪一列的平均数。需要注意的是,这里返回值的类型是double型,因为平均数基本上都是会带有小数的,用double类型可以最大程序保留小数位的精度。
同样地,average()方法也只能对具有运算能力的列进行求平均值,如果你传入了一个字符串类型的列,也是无法得到任何结果的,这时同样只会返回一个0作为结果。
max()
max()方法主要用于求出某个列中最大的数值,比如我们想要知道news表中所有新闻里面最高的评论数是多少,就可以这样写:
int result = DataSupport.max(News.class, "commentcount", int.class);
可以看到,max()方法接收三个参数,第一个参数同样还是Class,用于指定去统计哪张表当中的数据。第二个参数是列名,表示我们希望统计哪个列中的最大值。第三个参数用于指定结果的类型,根据实际情况来选择传入哪种类型就行了。
那么不用多说,max()方法也只能对具有运算能力的列进行求最大值的,希望你在使用的时候能够谨记这一点。
min()
min()方法主要用于求出某个列中最小的数值,比如我们想要知道news表中所有新闻里面最少的评论数是多少,就可以这样写:
int result = DataSupport.min(News.class, "commentcount", int.class);
min()方法和max()方法的用法基本上是一模一样的,参数也是完全相同,只是方法名变了一下。它们一个是求出某一列中的最大值,一个是求出某一列中的最小值,仅此而已!