LitePal 是一款开源的 Android 数据库框架,它采用了对象关系映射(ORM)的模式,将咱们平时使用的一些数据库(好比 Sqlite)功能进行了封装。javascript
第一步php
和咱们平时使用开源库同样,在项目的 build.gradle 文件下的 dependencies 闭包中添加依赖:java
compile 'org.litepal.android:core:1.4.1'复制代码
第二步android
须要配置 litepal.xml 文件,在 app/src/main 目录右键 -> New -> Directory , 建立一个 assets 目录,在该目录下新建一个 litepal.xml 文件,编辑内容以下:面试
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="AndroidDevelop"></dbname>
<version value="1"></version>
<list>
</list>
</litepal>复制代码
说明:这里的
标签用于指定全部的映射模型。
第三步闭包
配置 LitePalApplicationapp
<application android:name="org.litepal.LitePalApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>复制代码
通过上面的步骤已经将 LitePal 配置完成,那么如今就经过建立表来验证一下。框架
验证和建立测试
新建一个 AndDev 类:
package com.example.mu_16jj.litepaldemo.bean;
/** * Description:AndDev其实就是一张表 * <p> * WeChat:mu-16jj * <p> * Created by mu-16jj on 2017/3/29. */
public class AndDev {
private String name;
private int age;
private String sex;
private int workedTime;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getWorkedTime() {
return workedTime;
}
public void setWorkedTime(int workedTime) {
this.workedTime = workedTime;
}
}复制代码
说明:你们确定都很熟悉,这就是一个 JavaBean ,定义了几个属性,也就是咱们的表 AndDev 中有这些字段。
建好了表以后,接下来还须要将它添加到咱们的模型列表中:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="AndroidDevelop"></dbname>
<version value="1"></version>
<list>
<mapping class="com.example.mu_16jj.litepaldemo.bean.AndDev"></mapping>
</list>
</litepal>复制代码
如今咱们就能够测试了,启动一个 Activity ,我这里只添加了一个按钮,在其点击事件下写下面一句代码:
LitePal.getDatabase();复制代码
运行程序,点击按钮,而后打开 Android Device Monitor 查看结果以下:
可见咱们的数据库确实建立成功了,接下来咱们查看表是否建立成功,点击上图中的导出图标
这就证实咱们的数据库和表都建立成功了。
升级
就在咱们刚刚建立的 AndDev 表里面再增长一个 city(城市)列,只需在 AndDev 中添加 city 字段,设置 getter 和 setter 方法便可(代码本身添加);索性咱们再添加一张表,名为 Category ,代码以下:
package com.example.mu_16jj.litepaldemo.bean;
/** * Description:技术等级表 * <p> * WeChat:mu-16jj * <p> * Created by mu-16jj on 2017/3/29. */
public class Level {
private String primaryLevel;
private String middleLevel;
private String soniorLevel;
public String getPrimaryLevel() {
return primaryLevel;
}
public void setPrimaryLevel(String primaryLevel) {
this.primaryLevel = primaryLevel;
}
public String getMiddleLevel() {
return middleLevel;
}
public void setMiddleLevel(String middleLevel) {
this.middleLevel = middleLevel;
}
public String getSoniorLevel() {
return soniorLevel;
}
public void setSoniorLevel(String soniorLevel) {
this.soniorLevel = soniorLevel;
}
}复制代码
咱们还须要作最后一步操做,须要将咱们的对象和关系型数据库创建关系:
说明:能够看到这段代码相比以前修改了两个地方,数据库版本号修改成 2 ,增长了一个
能够看到,AndDev 表中增长了一个 city 列,level 表也建立成功了。
前面已经配置好环境,冰成功建立了两张表,下面咱们就针对这两张表进行CRUD操做,先来给 AndDev 表添加一组数据,在咱们的 Activity 上再添加一个按钮,其点击事件代码以下:
AndDev andDev = new AndDev();
andDev.setAge(25);
andDev.setCity("北京");
andDev.setName("code小生");
andDev.setSex("man");
andDev.setWorkedTime(2);
andDev.save();复制代码
仔细看看上面的代码,对于最后一行是否是有些疑惑了,这里须要说明的是,litepal 对表的 CRUD 操做依赖一个类 DataSupport ,因此若是咱们须要对表进行操做,那么这个实体类就须要继承 DataSupport 类才能够。
运行程序,点击添加按钮,查看结果:
能够看到,一组数据成功添加进了咱们的 AndDev 表。
咱们通常的更新就是针对已存储的对象进行从新设值,那么,LitePal 是怎么判断某个对象是已存储的呢?固然提供了方法,经过 model.isSaved() 方法返回结果来判断,true 表示已存储,false 表示未存储,那就须要知道一个概念 [ 什么是已存储 ]?两种状况,一种是已经调用过 model.save() 方法去添加数据了;另外一种是 model 对象是经过 LitePal 查询 API 查出来的,那么这两种状况都会被认为是已存储的对象。
第一种更新方式
AndDev andDev1 = new AndDev();
andDev1.setWorkedTime(3);
andDev1.setSex("woman");
andDev1.setName("codexiaosheng");
andDev1.setAge(26);
andDev1.setCity("杭州");
andDev1.save();
andDev1.setWorkedTime(5);
andDev1.save();复制代码
运行查看结果:
AndDev andDev1 = new AndDev();
andDev1.setCity("甘肃");
andDev1.setWorkedTime(3);
andDev1.updateAll("age = ? and sex = ?", "26", "woman");复制代码
运行结果:
注意:
若是想把某个字段的值置为默认,那么经过对象的 setXXX() 方法是不起做用的(由于根据就不会调用),LitePal 提供了更新默认的方法,好比下面的示例:
AndDev andDev2 = new AndDev();
andDev2.setToDefault("age");
andDev2.updateAll();复制代码
执行这段代码,就会将全部年龄置为 0 ,updateAll()方法接收一个可变参数变量,不写默认就对全部列生效。
咱们仍是先来看一段代码执行后的结果,删除按钮监听代码:
DataSupport.deleteAll(AndDev.class, "city = ?", "北京");复制代码
结果:
LitePal 的查询 API 就更人性化,使用起来挺方便,下面就看例子。在界面添加删除按钮,点击事件执行下面代码:
List<AndDev> andDevs = DataSupport.findAll(AndDev.class);
for (AndDev andDev1 : andDevs) {
Log.e("MainActivity", "age: " + andDev1.getAge());
Log.e("MainActivity", "name: " + andDev1.getName());
Log.e("MainActivity", "sex: " + andDev1.getSex());
Log.e("MainActivity", "workedtime: " + andDev1.getWorkedTime());
Log.e("MainActivity", "city: " + andDev1.getCity());
}复制代码
运行查看结果以下:
能够看到,表中的全部数据都已查到,这个方法使用起来方便多了。固然了,LitePal 还给咱们提供了其余的查询方法,这里列举以下:
findFirst(xxx.class); 查询表中第一条数据;返回一个实体类对象。
findLast(xxx.class); 查询表中最后一条数据;返回一个实体类对象。
select() 方法用于指定查询那几列;返回一个 List 集合;
DataSupport.select("列名1","列名2").find(实体类.class);复制代码
where() 方法用于指定查询约束条件;返回一个 List 集合;
DataSupport.where("age > >", "20").find(实体类.class);复制代码
order() 方法用于指定结果的排序方式;返回一个 List 集合;
DataSupport.order("age desc").find(实体类.class);复制代码
limit() 方法用于指定查询结果的数量;返回一个 List 集合;好比只查表中前 2 条数据,写法以下:
DataSupport.limit(3).find(实体类.class);复制代码
offset() 方法用于指定查询数据的偏移量;返回一个 List 集合;好比查表中第 2 条、第 3 条数据,写法以下:
DataSupport.limit(2).offset(1).find(实体类.class);复制代码
固然了咱们能够将上面的方法组合起来进行复杂查询:
// 复杂查询
List<AndDev> andDevs = DataSupport.select("name", "sex", "age")
.where("city = ?", "甘肃")
.order("workedTime")
.limit(5)
.offset(2)
.find(AndDev.class);复制代码
这段代码表示,查询 AndDev 表中第 3- 7 条知足 city 为甘肃这个条件的 name、sex、age 这三列数据,并将查询结果按照 workedTime 升序排列。
固然了, LitePal 任然支持原生的 SQL 查询:
Cursor cursor = DataSupport.findBySQL("select * from AndDev where age > ? and workedTime < 2", "22", "2");复制代码
推荐专题《Android开发资源经验分享》《Android面试专辑》