本文LitePal的使用方法来自郭霖的第一行代码。
博客地址 : http://blog.csdn.net/guolin_blog/article/details/38461239
传统的数据库操作都是通的SOL语句进行的,使用起来也不是很方便,今天我们就介绍一下LitePal框架
LitePal采取的是对象关系映射(ORM)的模式,将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射了。它允许我们使用面向对象的方式来操作数据库,从而可以从晦涩难懂的SQL语言中解脱出来。
配置Litepal
compile 'org.litepal.android:core:1.4.1'
- 配置litepal.xml 文件
在assets目录下新建一个litepal.xml 文件,编辑文件内容如下:
<litepal>
<dbname value="studentData"></dbname>
<version value="1"/>
<list>
</list>
</litepal>
dbname 标签用于指定数据库的名称,version 指定数据库的版本,list 用于指定所有的映射模型,后续我们建表示就会用到
- 配置LitePalApplication
修改AndroidManifest.xml文件:
<application
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
......
这样LitePal就配置完成了,下面我们就可以开始使用了
创建和升级数据库
- 创建数据库
我们这里建立一张学生信息表(是不是有种熟悉的味道),这里我们定义一个student类:
public class Student {
//每一个字段对应的表中的每一列,
//Student类就对应着数据库中的student表
private int id;
private String student_number;
private String name;
private int age;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudent_number() {
return student_number;
}
public void setStudent_number(String student_number) {
this.student_number = student_number;
}
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;
}
}
在litepal.xml中添加映射关系:
<list>
<mapping class = "com.example.litepal_demo.Student"/>
</list>
现在我们只要进行任意一次的数据库操作,定义的数据库studentData.db 就会自动的创建:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LitePal.getDatabase();
}
LitePal.getDatabase()方法就是一次简单的数据库操作,执行之后数据库就会自动创建,到这里我们的数据库创建就实现了,是不是很简单。
数据库的升级
使用litePal升级数据也非常简单,我们不应担心升级数据库时,数据丢失的问题,只需要修改版本号即可,比如我们新加一个表,显示学生的成绩:
public class StudentScore {
private int id;
private String student_number;
private float score_Chinese;
private float score_English;
private float score_Math;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudent_number() {
return student_number;
}
public void setStudent_number(String student_number) {
this.student_number = student_number;
}
public float getScore_Chinese() {
return score_Chinese;
}
public void setScore_Chinese(float score_Chinese) {
this.score_Chinese = score_Chinese;
}
public float getScore_English() {
return score_English;
}
public void setScore_English(float score_English) {
this.score_English = score_English;
}
public float getScore_Math() {
return score_Math;
}
public void setScore_Math(float score_Math) {
this.score_Math = score_Math;
}
}
修改配置文件litepal.xml
<version value="2"/>
<list>
<mapping class = "com.example.litepal_demo.Student"/>
<mapping class = "com.example.litepal_demo.StudentScore"/>
</list>
重新执行代码,我们就可以发现我们的数据库新建了一个表。
接下来就是我们的CRUD了,这个是我们对数据库使用比较频繁的方法了
LitePal对数据库进行CRUD需要继承自 DataSupport类才行,我们对Student和StudentScore进行简单修改,继承DataSupport类,然后向表中添加数据:
- 添加数据
private void addData(){
Student student = new Student();
student.setName("张三");
student.setAge(19);
student.setSex("男");
student.setStudent_number("17000001");
student.save();
}
在存储数据是我们用到了student.save()方法来向数据库中存储数据。
- 更新数据
//更新数据
private void updateData() {
Student student = new Student();
student.setName("李四");
student.setAge(19);
student.setSex("男");
student.setStudent_number("17000002");
student.save();
//我们先添加了一条数据,在此给对象赋值后调用save方法,
//此时litepal会发现student对象已存储,因此不会添加一条新数据,而会更新当前的数据
student.setAge(20);
student.save();
}
通过判断条件,对数据进行更新:
//更新数据
private void updateDataByCondition() {
Student student = new Student();
student.setAge(21);
//更新名字为李四,且性别为男 学生的信息
student.updateAll("name = ? and sex = ?","李四","男");
}
方法中我们先从新设置数据,然后调用updateAll()方法执行更新操作,和SOL中的update()方法类似
updateAll() 方法中可以指定一个添加约束,若不指定,就表示更新所有数据。
注意:当我们想把某一字段更新成默认值时,是不可以用set的方式来更新数据的,Java中任何一个数据类型的字段都会有默认值,如 int 类型的默认值为 0 ,boolean 类型的默认值为 false,对数据想要更新为默认值时,litePal提供了一个 setToDefault() 方法,然后传入相应的列名就可以了
、
如下:
Student student = new Student();
student.setToDefault("sex");
student.updateAll();
- 删除数据
//删除数据
private void deleteData() {
//删除Student表中年龄小于18的学生信息
DataSupport.deleteAll(Student.class,"age < ?","18");
}
代码非常好理解,第一个是制定你要删除的表,后面是删除条件。不指定条件就表示删除所有数据。
查询数据
litePal对查询数据做了一些优化,代码十分的简洁,易懂。litepal查询数据返回的是一个对象类型的List的集合,而不是Cursor对象,这样我们在取值的时候就更加的方便- 查询所有数据
private void queryAllData() {
//查询所有数据
List<Student> list = DataSupport.findAll(Student.class);
for (Student student:list){
Log.i("TAG","name="+student.getName());
Log.i("TAG","age="+student.getAge());
Log.i("TAG","Sex="+student.getSex());
Log.i("TAG","StudentNumber="+student.getStudent_number());
}
}
- 查询第一条数据
Student student = DataSupport.findFirst(Student.class);
- 查询最后一调数据
Student student1 = DataSupport.findLast(Student.class);
- 运用连缀查询来制定更多的查询功能
//select() 查询制定的列
List<Student> list01 = DataSupport.select("name","age").find(Student.class);
//where() 根据约束条件查询
List<Student> list02 = DataSupport.where("age > ?","20").find(Student.class);
//order() 对查询的结果进行排序 desc 表示降序排列 asc或者不写表示升序排列
List<Student> list03 = DataSupport.order("student_number desc").find(Student.class);
//limit() 指定查询结果的数量
List<Student> list04 = DataSupport.limit(3).find(Student.class);
//offset() 制定查询结果的偏移量 比如查询地2,3 条数据
List<Student> list05 = DataSupport.offset(1).limit(2).find(Student.class);
//以上的所有方法可以任意搭配组合,来完成复杂的查询操作
List<Student> list06 = DataSupport.select("name","age","student_number")
.where("age >?","20")
.order("student_number")
.limit(5)
.find(Student.class);
以上就是LitePal查询的一些基础方法了,是不是代码更加的简洁明了。
当然如果上面的方法无法满足的你的需求,litePal也是支持使用原生的SQL来进行查询的:
Cursor cursor = DataSupport.findBySQL("select * from Student where page > ? ","20");
DataSupport.findBySQL()方法放回的是一个Cursor 对象,我们需要用原生的方法解析数据。