LitePal基本用法

在上一篇博客中,了解了SQLite的基本知识,并学习了如何使用Android系统提供的SQLiteOpenHelper帮助类和ContentValues辅助类来操作数据库,相比于直接使用SQL语句进行操作,似乎要方便简洁很多,只是当我们需要对数据库进行升级维护时,却往往会陷入麻烦,然而在开源环境下,我们不用太担心,因为很多开源的ORM框架为我们解决了这些问题。在目前的开发中,大部分的开发者基本都是使用的ORM框架,相比自己封装的方法,这些第三方框架在经过了大量的考验之后,在性能和效率上更加优异。
目前常见的ORM框架有OrmLite、SugarORM、GreenDAO、Active Android、LitePal和Realm等,其中Realm基于C++编写,直接运行在你的设备硬件上,因此运行很快。GreenDAO和LitePal是目前最受欢迎的,GreenDAO以集成简单和极好的效率而备受欢迎;LitePal除了由于在郭神的《第一行代码》中有进行讲解,还因其具有集成简单(几乎零配置)、体积小和API使用方便等特性而被大量使用。接下来让我们一起来看看如何使用LitePal,在GitHub上LitePal最新版本为1.6.0。

快速集成

引入开源库

我们可以有两种姿势引入开源库:

  1. 在Eclipse的使用
    下载最新版的开源包jar文件,加入到Android项目的lib文件加下,并进行相应的配置。
  2. 在Android studio下的正确姿势
    修改build.gradle文件,添加如下依赖,并点击Sync Project with Gradle Files按钮进行项目同步即可。
dependencies {
    compile 'org.litepal.android:core:1.6.0'
}

配置litepal.xml

下面是我在demo中的初始配置:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="CourseManage" />
    <version value="1" />

    <list>

    </list>
</litepal>

这是使用LitePal库时唯一的配置文件,其属性说明如下:

  • dbname:配置项目的数据库名称。value可以是带.db的后缀,也可以不带。如果没有后缀,LitePal会自动添加后缀。
  • version:配置数据库版本。每一次想要升级数据库,只需要将版本号+1即可。
  • list:配置映射类。
  • cases:配置库中数据表的表名和列表名的大小写,默认全部转换为小写,其值选项有“keep”(保持属性原样)、“lower”和“upper”。
  • storage:配置数据库文件的存储位置,内部或者外部,默认为内部;其值有““internal”(外部应用不可访问)、external”(外部应用可访问)和外存储器的其它路径。个人柑橘放在外部不安全,估计作者是想这样便于开发者在集成开发阶段的测试。

配置LitePalApplication

我们需要在AndroidManifest.xml下配置application的name值,可以直接配置为org.litepal.LitePalApplication,也配置为自己自定义的Application。自定义Application可继承于org.litepal.LitePalApplication(非必须),并在onCreate()方法中请求LitePal.initialize(context)方法,如下:

public class MyApplication extends LitePalApplication{

    @Override
    public void onCreate() {
        super.onCreate();
        LitePal.initialize(this);
    }
    ...
}

体验LitePal

在完成了上述配置之后,让我们一起体验LitePal强大的功能吧。

创建数据表

首先定义模型,这里先定义Student和Course连个模型类。并对部分属性添加约束条件。
Student模型类:

public class Student {
    @Column(unique = true, nullable = false)
    private int id;
    private String name;
    @Column(defaultValue = "f")
    private String sex;
    private int age;
    private String clas;
    ...
}

Course模型类:

public class Course {
    @Column(unique = true, nullable = false)
    private int id;
    private String name;
    @Column(defaultValue = "0")
    private int type;// 0-必修;1-选修
    ...
}

然后在litepal.xml中配置模型类映射列表:

<list>
    <mapping class="com.kevin.litepaldemo.bean.Student" />
    <mapping class="com.kevin.litepaldemo.bean.Course" />
</list>

在完成模型的创建和文件配置之后,在我们下一次操作数据库时,将会创建模型对应的数据表。即调用如下的方法:

LitePal.getDatabase();

调用了上述方法之后,框架会通过一些类的操作,生成相应的SQL建表语句,并最终将其执行。
除了创建模型对应的表,LitePal还能自动建立表之间的关联关系。例如,我们创建一个 Claz模型,并在其中依赖Student类。

public class Claz extends {
    @Column(unique = true, nullable = false)
    private int id;
    @Column(unique = true)
    private String name;
    private List<Student> students;
}

当claz表创建时,会在student表中增加列名为claz_id的新列(外键),其类型为 integer,使得claz表与student表形成关联。

升级表

对于表的升级也是非常简单的,只需通过改变模型,并将配置文件litepal.xml下version的值+1,在下一次操作数据库时,就会执行相应的改变。例如,我们对Student模型作如下改变。

public class Student {
    @Column(unique = true, nullable = false)
    private int id;
    private String name;
    @Column(defaultValue = "f")
    private String sex;
    private int age;
    @Column(ignore = true)
    private String clas;

在上面的代码中,我们给clas属性添加了一个注解(ignore默认为false),这会使得在创建/升级表时,clas属性被忽略掉,从而不会在表中生成对应的列,如果升级之前表中已有此列,那么会自动删除。将配置文件litepal.xml下version的值改为2,并重新运行程序之后,我们发现student表中已经不再有clas列了。

保存数据

在完成了建表工作之后,我们将要关心如何向表中添加数据,并对其中的数据进行CURD操作,为此,LitePal框架为我们提供一系列丰富的API,这些API都被封装在DataSupport类中,我们的数据模型只需要去继承DataSupport即可,在没有特别需求的情况下,完全不用重写任何的方法。
下图为DataSupport中的部分方法截图:
DataSupport类部分结构
LitePal框架所提供的API是基于标准的面向对象设计的,当需要保存数据时,我们只需将数据组装到相应的对象中,再调用save()方法即可。

Student student = new Student();
student.setId(1);
student.setName("Li-si");
student.setSex("m");
student.setAge(20);
student.setClas("soft 2");
student.save();

在执行了上述代码之后,我们就能够在student表下查询到名字为Li-si的记录了。

更新数据

如果是通过find()方法查询出来的记录,最简单的方式是调用save()方法。

Student student = DataSupport.find(Student.class, 1);
student.setAge(19);
student.save();

每一个模型都继承了DataSupport,因此都拥有update()和updateAll()方法,我们也可以使用这两个方法对特定id的记录或者所有记录进行更新操作。

//更新指定id的记录
Student student = new Student();
student.setAge(18);
student.update(1);
--------------------
//更新所有符合约束条件的记录
Student student = new Student();
student.setAge(18);
student.updateAll("sex = ?", "m");

删除数据

关于删除数据,框架除了提供静态方法delete()和deleteAll(),还提供了一个实例方法delete()。静态方法的delete()方法要求必须传入参数,即要操作的表对应的类及约束条件;一个对象想要调用实例方法delete(),那么这个对象中封装的数据必须是在库中存在的(即通过fisSave()方法返回true的已经过持久化的对象),否则delete()不做任何操作,而直接返回0。

//使用delete(Class<?> modelClass, long id)删除指定id的数据
DataSupport.delete(Student.class, 1);
-------------------
//使用deleteAll(Class<?> modelClass, String... conditions)删除符合约束条件的数据
DataSupport.deleteAll(Student.class, "name = ?", "Li-li");
-------------------
//使用实例方法delete()删除数据
Student student = DataSupport.find(Student.class, 3);
student.delete();

查询数据

关于查询,LitePal为我们提供了很多以find开头的方法,下面我们来看看其中最常用的三个。

//从表中查询指定id的记录
Student s = DataSupport.find(Student.class, 3);
-------------------
//查询表中所有记录
List<Student> tudents = DataSupport.findAll(Student.class);
-------------------
//构建具有约束条件的复杂查询,并对结果进行排序
List<Student> allStudents = DataSupport.where("name like ?", "L%").order("age").find(Student.class);

其它查询方法:

//查询表中第一条记录
DataSupport.findFirst(Student.class);
---------------------
//查询表中最后一条记录
DataSupport.findLast(Student.class);
---------------------
//直接使用SQL语句查询数据
DataSupport.findBySQL("select * from student");

异步操作

默认情况下,每一次数据库操作都是在主线程上执行的,然而当我们对大量数据进行操作时会很耗时,我们需要开启线程来执行操作。在LitePal框架中,所有的CRUD方法都支持异步操作,当想要将操作放在后台执行时,只需要调用相应的异步方法。例如,findAllAsync()方法,用于异步查询表中所有数据。

DataSupport.findAllAsync(Student.class).listen(new FindMultiCallback() {
    @Override
    public <T> void onFinish(List<T> t) {
       List<Student> allStudents = (ArrayList<Student>) t;
    }
});

只是用findAllAsync()代替findAll(),并附加一个listen()方法,查找结果将回调onFinish()方法,通过参数出入,我们只需在onFinish()中进行接收。

多库操作

如果应用需要使用多个数据库,LitePal也提供了支持。在运行应用时,我们可以创建多个数据库,如下:

//LitePalDB构造函数的参数分别为数据库名和版本号
LitePalDB litePalDB = new LitePalDB("CourseManage2", 1);
litePalDB.addClassName(Student.class.getName());             
litePalDB.addClassName(Course.class.getName());
litePalDB.addClassName(Claz.class.getName());
LitePal.use(litePalDB);

这样就可以创建 一个名为CourseManage2的数据库,在其中添加student、course和claz表,并使用数据库。
如果你想创建一个新的数据库,并使其具有litepal.xml中相同的配置,可以使用如下方法:

//fromDefault()方法参数为新数据库的名称
LitePalDB litePalDB = LitePalDB.fromDefault("newDbName");
LitePal.use(litePalDB);

使用如下代码,我们可以随时切换回默认的数据库。

LitePal.useDefault();

想要删除已存在的数据库并不难,使用下面代码:

LitePal.deleteDatabase("dbName");

关于混淆

在混淆文件中加入以下代码:

-keep class org.litepal.** {
    *;
}

-keep class * extends org.litepal.crud.DataSupport {
    *;
}

LitePal开源库地址请点击


版权声明:本文为jinwen_li2012原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>