欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LitePal的基本用法

程序员文章站 2024-03-17 09:40:10
...

快速配置

配置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;

相关资料:

郭霖的LitePal专栏

示例代码