学而实习之 不亦乐乎

Android:LitePal 操作 SQLite 数据库

2022-07-14 08:26:35

一、LitePal 概述

LitePal是一个开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平常所用到的一些数据库功能进行了封装,使得不用编写一行SQL语句,就可以完成各种建表和增删改查的操作。

二、LitePal 的配置

目前,我们要在android项目上即成开源库的话也是相当简单,大多数的开源项目都会提交到 jcenter 上,我们只需要在 app/build.gradle 文件中声明该开源库的引用就可以。

implementation 'org.litepal.android:java:3.0.0'

然后配置litepal.xml文件(在app/src/main目录下新建一个litepal.xml文件),并编辑内容为:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    //数据库名称
    <dbname value = "BookStore"> </dbname>
    // 数据库版本
    <version value = "1"> </version>
    //用于指定所有的映射模型
    <list>
    </list>
</litepal>

同时修改 AndroidManifest.xml 文件中的内容,在 <application> 中添加属性:

android:name="org.litepal.LitePalApplication"

数据库创建与升级
我们还拿上篇的一个例子。定义一个类Book类,继承自LitePalSupport,声明一些属性,并实现其getter和setter方法。

public class Book  extends LitePalSupport{

    private int id;
    private String auther;


    public void setId(int id) {
        this.id = id;
    }

    public void setAuther(String auther) {
        this.auther = auther;
    }

    public int getId() {
        return id;
    }

    public String getAuther() {
        return auther;
    }

}

其实Book类就对应一个Java bean。其实Book类就对应数据库当中的Book表。
然后我们修改litepal.xml文件,在list标签下增加:

<list>
    <mapping class = "com.example.test.Book"></mapping>
</list>

这里使用<mapping>来声明我们要配置的映射模型类,注意一定要是完成的类名,不管有多少的模型类需要映射都适用同样的方式配置在list标签下即可。现在只要进行任何一次数据库相关的操作,BookStore.db数据库就会自动的创建出来。

然后触发一个事件调用Connector.getDatabase()方法,该方法就是一次简单的数据库操作,执行这个方法之后 BookStore数据库就创建完成了。

三、数据库的升级
如果数据库不能满足我们的需要了,需要作出改进。例如:Book类需要增加字段,或者需要增加一张别的表,在这里假设我们要增加一张Category的表。该怎么升级呢?
步骤很简单:
1、在Book类中增加相应的字段,创建类似于Book的Category类。
2、修改litepal.xml文件内容,将version表示的版本增加,list中添加映射关系。

<?xml version="1.0" encoding="utf-8"?>

<litepal>
    <dbname value = "BookStore"> </dbname>
    <version value = "2"> </version>
    <list>
        <mapping class = "com.example.test.Book"></mapping>
        <mapping class = "com.example.test.Category"></mapping>
    </list>

</litepal>

使用LitePal实现数据库的增 删 改 查
其具体实现逻辑在此不作过多的叙述,直接看实现代码吧。
 

//增加数据
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Book book = new Book();

        book.setName("C语言");
        book.setAuther("Json");
        book.setPages(330);
        book.setPrice(39.9);
        book.setPress("北京人民教育出版社");

        book.save();//添加一条数据

        /*
        * 同一个bean存过一次后再存就会存储失败
        * */
        //对象是否存储过
        //Boolean isSave = book.isSaved();
        //book.saveAsync();//异步保存
        //book.saveThrows();
        //如果希望存储失败的话就抛出异常,而不是返回一个false,那就可以使用saveThrows()方法来代替。
        //使用saveThrows()方法来存储数据,一旦存储失败就会抛出一个DataSupportException异常,我们可以通过对这个异常进行捕获来处理存储失败的情况。

        //book.saveOrUpdate("name = ?" ,book.getName());//不存在就存储,已存在就更新的需求
    }
});

//更新数据的另一种方式
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Book book = new Book();
        //在这里调用setPrice()和setPress()来设置要更新的数据
        //调用updateAll()方法来执行更新
        book.setPrice(14.95);
        book.setPress("Gagaga");
        book.updateAll("name = ? and auther = ?" ,"数据结构","Liu Gaojian");
        //如果我们想要把一个字段的值全部更新为默认值,可以使用一下方式
        book.setToDefault("price");
        book.updateAll();

        //第一步,查找id为1的记录
        Book book1 = LitePal.find(Book.class,1);

        //第二步,改变某个字段的值
        book1.setPages(300);

        //保存数据
        boolean isSaveSuccess= book1.save();

        if (isSaveSuccess){
            //修改完成
        }else {
            //修改失败
        }

        Book book2 = new Book();
        book2.setName("操作系统");

        //直接更新id为1的记录
        book2.update(1);
        boolean isSaveSu = book2.save();

        if (isSaveSuccess){
            //修改完成
        }else {
            //修改失败
        }

        Book book3 = new Book();
        book3.setPress("HHHHHHHH");
        //将所有name为C语言的数据,press全部改成HHHHHHHH
        book3.updateAll("name = ?","C语言");
        Book book4 = new Book();
        book4.setPress("HHHHHHHH");

        //将所有name为C语言的、pages为300数据,press全部改成HHHHHHHH
        book4.updateAll("name = ? and pages = ?","C语言","300");
    }
});

//删除数据数据
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //条件删除
        LitePal.deleteAll(Book.class,"price < ?","15");
        //返回值是int,表示删除了几条数据,返回0表示没有删除
        //int isdelect= LitePal.deleteAll(Book.class);        
    }
});

//查询数据
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //通过id查询
        Book book_ = LitePal.find(Book.class,1);

        //查询全部
        List<Book> books = LitePal.findAll(Book.class);
        for (Book book : books){
            Log.d("GGGGGGG",book.getName().toString());
        }

        //根据姓名查找,并按照某字段排序
        List<Book> books_ = LitePal.where("name = ?","Liu gaojian").order("price").find(Book.class);
        for (Book book : books_){
            Log.d("GGGGGGG",book.getName().toString());
        }
        
        //查price小于30
        List<Book> book_s_ = LitePal.where("price < ?","30").find(Book.class);
        for (Book book : book_s_){
            Log.d("GGGGGGG",book.getName().toString());
        }
    }
});