LitePal的基本用法
快速配置
配置litepal.xml
在项目的assets目录下面新建一个litepal.xml文件,并将以下代码拷贝进去:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="demo" ></dbname>
<version value="1" ></version>
<list>
</list>
<dbname>用于设定数据库的名字,<version>用于设定数据库的版本号,<list>用于设定所有的映射模型
配置LitePalApplication
由于操作数据库时需要用到Context,而我们显然不希望在每个接口中都去传一遍这个参数,那样操作数据库就显得太繁琐了。因此,LitePal使用了一个方法来简化掉Context这个参数,只需要在AndroidManifest.xml中配置一下LitePalApplication,所有的数据库操作就都不用再传Context了。
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>
如果已经有了Application,需要改变一下Application的继承结构。继承LitePalApplication。
但是,有些程序可能会遇到一些更加极端的情况,比如说MyApplication需要继承另外一个AnotherApplication,并且这个AnotherApplication还是在jar包当中的,不能修改它的代码。这种情况应该算是比较少见了,但是如果你遇到了的话也不用急,仍然是有解释方案的。你可以把LitePal的源码下载下来,然后把src目录下的所有代码直接拷贝到你项目的src目录下面,接着打开LitePalApplication类,将它的继承结构改成继承自AnotherApplication,再让MyApplication继承自LitePalApplication,这样所有的Application就都可以在一起正常工作了。
以上配置就完成了。
建表
根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),也就是说,如果我们想要建一张news表,就应该有一个对应的News模型类。新建一个User类,表中的每一列其实就是对应了模型类中的一个字段,比如表中有id、name、age、gender 类中就也应该有这几个字段。id作为主键
public class User implements Serializable {
private int id;
private String name;
private int age;
private int grander;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name == null ? "" : name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGrander() {
return grander;
}
public void setGrander(int grander) {
this.grander = grander;
}
}
LitePal的映射规则是非常轻量级的,不像一些其它的数据库框架,需要为每个模型类单独配置一个映射关系的XML,LitePal的所有映射都是自动完成的。根据LitePal的数据类型支持,可以进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String和Date。只要是声明成这8种数据类型的字段都会被自动映射到数据库表中,并不需要进行任何额外的配置。
配置到映射列表
编辑assets目录下的litepal.xml文件,在<list>标签中加入User模型类的声明
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--数据库名-->
<dbname value="hailhydra"></dbname>
<!--版本-->
<version value="1"></version>
<list>
<mapping class = "com.yeqiu.hailhydra.data.User"/>
</list>
</litepal>
现在只要对数据库有任何操作,user表就会自动被创建。比如获取SQLiteDatabase示例。
private void initDb() {
SQLiteDatabase db = Connector.getDatabase();
}
升级
不需要去编写任何与升级相关的逻辑,也不需要关心程序是从哪个版本升级过来的,唯一要做的就是确定好最新的Model结构是什么样的,然后将litepal.xml中的版本号加1,所有的升级逻辑就都会自动完成了。
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="demo" ></dbname>
<version value="2" ></version>
<list>
</list>
增删字段都可以通过这种方式。
增删改查
LitePal要求所有的实体模型都继承DataSupport才能具备CRUD的操作,修改模型:
public class User extends DataSupport implements Serializable{
private int id;
private String name;
private int age;
private int grander;
}
增加
只需要创建模型数据,调用sava()方法。save()方法还是有返回值的,我们可以根据返回值来判断存储是否成功。
private void addUserData(){
User user = new User();
user.setName("狗蛋");
user.setAge(18);
user.setGrander(1);
boolean success = user.save();
}
关于id
模型中的id是不需要赋值的,当调用save()方法或saveThrows()方法存储成功之后,LitePal会自动将该条数据对应的id赋值到实体类的id字段上。
批量增加:
对于储存即可可以通过循环保存。
List<News> newsList;
...
for (News news : newsList) {
news.save();
通过一个循环来遍历出这个集合中的每一个News对象,然后逐个调用save()方法。这样的写法当然是可以的,但是效率会比较低,因为调用save()方法的时候除了会执行存储操作之外,还会去分析News类的关联关系,那么每次循环都去重新分析一遍关联关系显然是比较耗时的。因此,LitePal提供了一个saveAll()方法,专门用于存储集合数据的,saveAll()方法接收一个Collection集合参数,只要把待存储的集合数据传入即可。这个方法可以完成和上面一段代码完全一样的功能,但效率却会高得多,而且写法也更加简单。
List<News> newsList;
...
DataSupport.saveAll(newsList);
修改和删除
修改的方法定义在DataSupport中。方法定义如下:
public static int update(Class<?> modelClass, ContentValues values, long id)
这个静态的update()方法接收三个参数,第一个参数是Class,传入我们要修改的那个类的Class就好,第二个参数是ContentValues对象,这三个参数是一个指定的id,表示我们要修改哪一行数据。
例:修改id1的数据
private void update(){
ContentValues contentValues = new ContentValues();
contentValues.put("name","狗剩");
DataSupport.update(User.class,contentValues,1);
}
修改符合条件的所有数据,方法定义如下:
public static int updateAll(Class<?> modelClass, ContentValues values, String... conditions)
updateAll()方法表示修改多行记录,其中第一个参数仍然是Class,第二个参数还是ContentValues对象,第三个参数是一个conditions数组,用于指定修改哪些行的约束条件,返回值表示此次修改影响了多少行数据。例:
ContentValues contentValues = new ContentValues();
contentValues.put("name","狗剩");
DataSupport.updateAll(User.class, contentValues, "name = ?", "狗蛋");
前面都没什么好说的,重点我们看一下最后的这个conditions数组,由于它的类型是一个String数组,我们可以在这里填入任意多个String参数,其中最前面一个String参数用于指定约束条件,后面所有的String参数用于填充约束条件中的占位符(即?号),比如约束条件中有一个占位符,那么后面就应该填写一个参数,如果有两个占位符,后面就应该填写两个参数,以此类推。
删除:
方法定义
public static int delete(Class<?> modelClass, long id)
private void delete() {
DataSupport.delete(User.class, 1);
}
这不仅仅会把id 1的记录删除,同时还有将其他关联的外键数据都删除。
除了删除指定id的数据之外,DataSupport中也提供了一个通过where语句来批量删除数据的方法,先看一下方法定义:
public static int deleteAll(Class<?> modelClass, String... conditions)
deleteAll()方法接收两个参数,第一个参数是Class,传入我们要删除的那个类的Class就好,第二个参数是一个conditions数组,用于指定删除哪些行的约束条件,返回值表示此次删除了多少行数据,用法和updateAll()方法是基本相同的。
DataSupport.deleteAll(User.class, "name = ? ", "狗蛋");
删除所有数据
DataSupport.deleteAll(User.class);
查询
private void find(){
User user = DataSupport.find(User.class, 1);
}
指定查询条件查询
List<User> users = DataSupport.where("name = ", "狗蛋").find(User.class);
LitePal 2.0
新版修改了大量的api
使用LitePalSupport代替DataSupport,增删改查的api封装到了LitePal;
相关资料:
上一篇: android开发针对api28引入最新butterknife新建项目的血案
下一篇: Day03