LitePal基本用法
来源:互联网 发布:图片 js 点击放大 wap 编辑:程序博客网 时间:2024/05/18 02:17
在上一篇博客中,了解了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。
快速集成
引入开源库
我们可以有两种姿势引入开源库:
- 在Eclipse的使用
下载最新版的开源包jar文件,加入到Android项目的lib文件加下,并进行相应的配置。 - 在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中的部分方法截图:
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开源库地址请点击
- LitePal的基本用法
- LitePal基本用法_01
- LitePal的基本用法
- LitePal的基本用法
- LitePal的基本用法
- LitePal基本用法
- LitePal的基本用法_02
- 创建表和LitePal的基本用法
- 安卓好用的数据库LitePal的基本用法
- 创建表和LitePal的基本用法
- Android创建数据表和LitePal的基本用法
- Android数据库--创建表和LitePal的基本用法
- 安卓数据库框架LitePal(二):基本用法
- android数据库--创建表和LitePal基本用法
- 开源库LitePal的用法
- LitePal简单用法
- LitePal的基础用法
- Android数据库高手秘籍(二)——创建表和LitePal的基本用法
- HDU 6076 题解
- POJ2229 Sumsets
- Oracle db_link数据同步(数据量小)
- css3学习1
- 加载外部数据
- LitePal基本用法
- 如何查看ubuntu的内核版本和发行版本号?
- swift练习-String、Array、Dictionary、Set
- JS创建对象的模式及其优缺点详解
- 大型网站架构演变史(含技术栈与价值观)
- 【POJ】3061---Subsequence(二分)
- Java 并发工具包 java.util.concurrent 用户指南
- Android Fragment传值
- git 查看远程仓库的信息 以及 git fetch 和git pull 的区别