欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android中数据库开发之LitePal的基本用法

程序员文章站 2024-03-17 09:31:52
...

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()方法的用法基本上是一模一样的,参数也是完全相同,只是方法名变了一下。它们一个是求出某一列中的最大值,一个是求出某一列中的最小值,仅此而已!