使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub

GitHub项目地址:

https://github.com/Skymqq/LitePalSave.git

 

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

首先新建一个LitePalSave项目。

配置LitePal

Android中配置开源库的方法有很多种,第一种(也是优先推荐的方法)声明开源库的依赖的引用,第二种就是去开源库的官网下载不同版本的jar包,然后再手动copy到项目的lib文件夹中,再add到本地。这里我们就直接使用第一种添加开源库依赖的引用的方式来一键导入开源库。

在app/build.gradle文件的dependencies闭包中添加如下内容:

//配置LitePal
    implementation 'org.litepal.android:core:1.4.1'

添加的这一行声明中,前面部分是固定的,最后的1.4.1是版本号的意思,最新的版本号可以到LitePal的项目主页上去查看。

这样我们就把LitePal成功引入到当前项目中了,接下来需要配置litepal.xml文件。右击app/src/main 目录 New  Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--数据库名-->
    <dbname value="BookStore" />

    <!--数据库版本-->
    <version value="1" />

    <!--映射模型列表-->
    <list>

    </list>

</litepal>

最后还需要在AndroidManifest.xml中的<application>标签中添加一行代码:

android:name="org.litepal.LitePalApplication"

这里我们将项目的application配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能都可以工作。


创建和升级数据库

我们之前创建数据库时通过自定义一个类继承自SQLiteDatabase,然后在onCreate()方法中编写建表语句来实现的,而采用对象关系映射(ORM)模式的LitePal就很容易实现了。 那么什么是对象关系映射(ORM)呢?简单的来说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射。它赋予了我们一个强大的功能,就是可以用面向对象的思维来操作数据库,而不用再去使用SQL语句了。

之前为了创建一张Book表,需要先分析表中应该包含哪些列,然后再编写出一条建表语句,最后在自定义的SQLiteOpenHelper中去执行这条建表语句。但是使用LitePal,你就可以用面向对象的思维来实现同样的功能了,定义一个Book实体类,代码如下所示:

package com.example.administrator.litepalsave;

public class Book {

    private int id;

    private String author;

    private double price;

    private int pages;

    private String name;

    public int getId() {
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这是一个典型的JavaBean,在Book类中我们定义了id、author、price、pages、name这几个字段,并生成了相应的getter和setter方法。Book类中声明的成员变量分别对应了表中的每一个列,这就是对象关系映射(ORM)最直观的体验。

接下来我们需要将Book类添加到映射模型列表中,修改litepal.xml中的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--数据库名-->
    <dbname value="BookStore" />

    <!--数据库版本-->
    <version value="1" />

    <!--映射模型列表-->
    <list>
        <mapping class="com.example.administrator.litepalsave.Book"/>
    </list>

</litepal>

这里使用<mapping>标签来声明我们要配置的映射模型类。注意一定要使用完整的类名。不管有多少模型类需要映射,都使用同样的方式配置<list>标签下即可。

最后,activity.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_create"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create Database"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Data"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update Data"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete Data"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query Data"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />
</LinearLayout>

MainActivity.java代码:

package com.example.administrator.litepalsave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_create, btn_add, btn_delete, btn_update, btn_query;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
    }

    private void initView() {
        btn_create = (Button) findViewById(R.id.btn_create);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_delete = (Button) findViewById(R.id.btn_delete);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_query = (Button) findViewById(R.id.btn_query);

        btn_create.setOnClickListener(this);
        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create:
                createDatabase();//创建数据库
                Toast.makeText(this, "Create Database successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_add:
                break;
            case R.id.btn_delete:
                break;
            case R.id.btn_update:
                break;
            case R.id.btn_query:
                break;
        }
    }

    private void createDatabase() {
        LitePal.getDatabase();//通过assets中的litepal.xml文件中的信息,创建BookStore数据库,并根据对象映射列表中的信息创建Book表
    }

}

运行程序,点击Create Database按钮之后,Toast提示创建数据库和数据库表成功:

为了验证创建成功,我们使用adb shell 来查看具体情况:

好了,使用LitePal创建BookStore数据库和创建Book表就完成了,

sqlite3 数据库名   用来查看数据库

.table命令  用来查看数据库表

.schema  用来查看建表语句

可以看到,这里有3张表的建表语句,其中android_metadata表不用管,table_schema表是LitePal内部使用的。我们也可以直接忽视,book表就是根据我们自定义的Book类以及类中的成员变量来自动生成的。

之前在我们使用SQLiteOpenHelper来升级数据之前,必须得先把之前的表drop掉,然后再重新创建才行。这其实是一个非常严重的一个问题,因为这样子会造成数据的丢失,每当升级一次数据库,之前表中的数据就全部没有了。

当然如果你是一个非常有经验的程序员,也可以通过复杂的逻辑控制来避免这种情况,但是维护成本很高。而使用LitePal,这就不是什么问题了,操作也很简单,只需要在修改内容之后,将版本号加1就行了。

比如说我们想要向Book表中添加一个press(出版社)列,直接修改Book类中代码,添加一个press字段即可,如下所示:

 private String press;

    public String getPress() {
        return press;
    }

    public void setPress(String press) {
        this.press = press;
    }

与此同时,我们还想再添加一张Category表,那么只需要新建一个Category类就可以了,代码如下所示:

package com.example.administrator.litepalsave;

public class Category {

    private int id;

    private String categoryName;

    private int categoryCode;

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

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public void setCategoryCode(int categoryCode) {
        this.categoryCode = categoryCode;
    }
}

改完了所有我们想改的东西,只需要记得将版本号加1就行了。当然由于这里还需要添加一个新的模型类,因此也需要将它添加到映射模型列表中。修改assets中的litepal.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--数据库名-->
    <dbname value="BookStore" />

    <!--数据库版本-->
    <version value="2" />

    <!--映射模型列表-->
    <list>
        <mapping class="com.example.administrator.litepalsave.Book"/>
        <mapping class="com.example.administrator.litepalsave.Category"/>
    </list>

</litepal>

重新运行一次程序,然后点击Create Database按钮,再重新查看一下最新的建表语句,发现如下所示:

可以看到,book表中新增了一个press列,category表也创建成功了,当然LitePal还自动帮我们做了一项非常重要的工作,就是保留之前表中的所有数据,这样也就再也不用担心数据丢失的隐患了。


使用LitePal添加数据

首先回顾一下之前添加数据的方法,我们需要创建出一个ContentValues对象,然后将所有要添加的数据put到这个ContentValues对象当中,然后再调用SQLiteDatabase的insert()方法将数据添加到数据库表中。

而使用LitePal来添加数据,只需要创建出模型类的实例,再将所有要存储的数据设置好,最后调用一下save()方法就可以了。

下面手动来实现一下,观察现有的模型类,你会发现他们都是没有继承结构的。没错,因为进行表管理操作时不需要模型类有任何的继承结构,但是进行CRUD操作时就不行了,必须要继承自DataSupport类才行,因此这里我们需要先把继承结构给加上,修改Book类中代码,如下所示:

package com.example.administrator.litepalsave;

import org.litepal.crud.DataSupport;

public class Book extends DataSupport {

    private int id;

    private String author;

    private double price;

    private int pages;

    private String name;

    private String press;

    public String getPress() {
        return press;
    }

    public void setPress(String press) {
        this.press = press;
    }

    public int getId() {
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

只修改了extends  DataSupport这一句

 

MainActivity.java代码:

package com.example.administrator.litepalsave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_create, btn_add, btn_delete, btn_update, btn_query;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
    }

    private void initView() {
        btn_create = (Button) findViewById(R.id.btn_create);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_delete = (Button) findViewById(R.id.btn_delete);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_query = (Button) findViewById(R.id.btn_query);

        btn_create.setOnClickListener(this);
        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create:
                createDatabase();//创建数据库
                Toast.makeText(this, "Create Database successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_add:
                addData();//添加数据
                Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_delete:
                break;
            case R.id.btn_update:
                break;
            case R.id.btn_query:
                break;
        }
    }


    private void createDatabase() {
        LitePal.getDatabase();//通过assets中的litepal.xml文件中的信息,创建BookStore数据库,并根据对象映射列表中的信息创建Book表
    }

    private void addData() {
        Book book = new Book();//创建Book实例
        book.setName("The Da Vinci Code");//设置书名
        book.setAuthor("Dan Brown");//设置作者
        book.setPages(454);//设置页数
        book.setPrice(16.96);//设置价格
        book.setPress("Unknow");//设置出版社
        book.save();//保存数据
    }
}

重新运行程序,点击Add Data按钮,Toast提示数据添加成功:

adb shell 查看Book表中的数据,输入SQL语句:select *from Book;

或者;也可以在Device File Explorer中到/data/data/com.example.administrator.litepalsave/databases/路径下找到BookStore.db文件,将这个文件保存到桌面,然后通过数据库管理工具查看即可。


使用LitePal更新数据

学习完了如何使用LitePal添加数据,接下来我们看看怎样使用LitePal更新数据。更新数据要比添加数据稍微复杂一点,因为它的API接口比较多,这里我们只介绍最常用的几种更新方式。首先,最简单的一种更新方式就是对一存储的对象重新设值,然后重新调用save()方法即可。那么这里我们就要了解一个概念,什么是已存储的对象?

对于LitePal来说,对象是否已存储就是根据调用model.isSaved()方法的结果来判断的,返回true就表示已存储,返回false就表示未存储。那么接下来的问题就是,什么情况下会返回true,什么情况下会返回false呢?

实际上只有在两种情况下model.isSaved()方法才会返回true,一种情况是已经调用过model.save()方法去添加数据了,此时model会被认为是已存储的对象。另一种情况是model对象是通过LitePal提供的查询API查出来的,由于是从数据库中查到的对象,因此也会被认为是已存储的对象。

这里我们通过第一种情况来进行验证。修改MainActivity.java代码:

package com.example.administrator.litepalsave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_create, btn_add, btn_delete, btn_update, btn_query;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
    }

    private void initView() {
        btn_create = (Button) findViewById(R.id.btn_create);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_delete = (Button) findViewById(R.id.btn_delete);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_query = (Button) findViewById(R.id.btn_query);

        btn_create.setOnClickListener(this);
        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create:
                createDatabase();//创建数据库
                Toast.makeText(this, "Create Database successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_add:
                addData();//添加数据
                Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_delete:
                break;
            case R.id.btn_update:
                updateData();//更新数据
                Toast.makeText(this, "Update Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_query:
                break;
        }
    }


    private void createDatabase() {
        LitePal.getDatabase();//通过assets中的litepal.xml文件中的信息,创建BookStore数据库,并根据对象映射列表中的信息创建Book表
    }

    private void addData() {
        Book book = new Book();//创建Book实例
        book.setName("The Da Vinci Code");//设置书名
        book.setAuthor("Dan Brown");//设置作者
        book.setPages(454);//设置页数
        book.setPrice(16.96);//设置价格
        book.setPress("Unknow");//设置出版社
        book.save();//保存数据
    }

    private void updateData() {
        Book book = new Book();//创建Book实例
        book.setPrice(14.95);//设置价格
        book.setPress("Anchor");//设置出版社
        book.updateAll("name=? and author=?", "The Da Vinci Code", "Dan Brown");
    }
}

点击Update Data按钮,Toast提示成功更新数据:

使用adb shell查看更新后的数据情况

更新前Book表中的数据:

更新后Book表中的数据:

 

意料之中,书名为"The Da Vinci Code",作者为"Dan Brown"的这本书的价格由16.96修改成14.95.怎么样?LitePal的更新API是不是明显比SQLiteDatabase的update()方法要好用多了?

不过,在使用updateAll()方法时,还有一个非常重要的知识点是你需要知晓的,就是当你想把一个字段的值更新成默认时,是不可以使用上面的方式来set数据的。我们都知道,在Java中任何一种数据类型的字段都会有默认值,例如int类型的默认值为0,boolean类型的默认值是false,String类型的默认值为null。那么当new出一个Book对象时,其实所有字段都已经被初始化成默认值了,比如说pages字段的值就是0,。因此,如果我们想把数据库表中的pages列更新成0,直接调用book.setPages(0)是不可以的,因为即使不调用这行代码,pages字段本身也是0,LitePal此时是不会对这个列进行更新的。对于所有想要将为数据更新成默认值的操作,LitePal统一提供了一个setDefault()方法,然后传入相应的列名就可以实现了。比如我们可以这样写:

Book book=new Book();

book.setToDefault("pages");

book.updateAll();

这段代码的意思是,将所有的页数都更新为0,因此updateAll()方法中没有指定约束条件,因此更新操作对所有数据都生效了。


使用LitePal删除数据

使用LitePal删除数据的方式主要有两种,第一种比较简单,就是直接调用已存储对象的delete()方法就可以了,第二种就是直接通过DataSupport类调用deleteAll()静态方法来删除数据:

例如我们将Book表中pages<500页的书给删除就可以这样子写:

DataSupport.deleteAll(Book.class, "pages < ?", "500");

MainActivity.java代码:

package com.example.administrator.litepalsave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.litepal.LitePal;
import org.litepal.crud.DataSupport;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn_create, btn_add, btn_delete, btn_update, btn_query;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
    }

    private void initView() {
        btn_create = (Button) findViewById(R.id.btn_create);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_delete = (Button) findViewById(R.id.btn_delete);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_query = (Button) findViewById(R.id.btn_query);

        btn_create.setOnClickListener(this);
        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create:
                createDatabase();//创建数据库
                Toast.makeText(this, "Create Database successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_add:
                addData();//添加数据
                Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_delete:
                deleteData();//删除数据
                Toast.makeText(this, "Delete Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_update:
                updateData();//更新数据
                Toast.makeText(this, "Update Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_query:
                break;
        }
    }


    private void createDatabase() {
        LitePal.getDatabase();//通过assets中的litepal.xml文件中的信息,创建BookStore数据库,并根据对象映射列表中的信息创建Book表
    }

    private void addData() {
        Book book = new Book();//创建Book实例
        book.setName("The Da Vinci Code");//设置书名
        book.setAuthor("Dan Brown");//设置作者
        book.setPages(454);//设置页数
        book.setPrice(16.96);//设置价格
        book.setPress("Unknow");//设置出版社
        book.save();//保存数据
    }

    private void updateData() {
        Book book = new Book();//创建Book实例
        book.setPrice(14.95);//设置价格
        book.setPress("Anchor");//设置出版社
        book.updateAll("name=? and author=?", "The Da Vinci Code", "Dan Brown");
    }

    private void deleteData() {
        DataSupport.deleteAll(Book.class, "pages < ?", "500");
    }

}

点击Delete Data按钮,Toast提示删除数据成功:

adb shell查看

删除前Book表中的数据:

删除后Book表中的数据:

可以看到,我们将Book表中pages<500页的书给删除了。


使用LitePal查询数据

之前的查询数据我们都是通过SQLiteDatabase中的query()方法来查询数据的,冗长的参数列表让人看得头疼,即使多数参数都用不到,也不得不传入null,如下所示:

Cursor cursor=db.query("Book",null,null,null,null,null,null);

像这样的代码恐怕是没人会喜欢的。为此LitePal在查询API方面做出了非常多的优化,基本上可以满足绝大多数场景的查询需求,并且代码十分整洁,下面我们就来一起学习一下。

首先分析一下上述代码,query()方法中使用了第一个参数指明了查询哪张表中的数据,后面的参数全部为null,这就表示希望查询这张表中的所有数据。那么使用LitePal如何完成同样的功能呢?非常简单,只需要这样写:

List<Book> books=DataSupport.findAll(Book.class);

怎么样,代码是不是精简了许多,没有冗长的参数列表,只需要调用DataSupport类中的findAll()静态方法,然后通过Book.class参数指定查询Book表就可以。另外,findAll()方法的返回值是一个Book类型的List集合,也就是说,我们不用像之前那样再通过Cursor对象一行行去取值,再放入集合中。LitePal已经帮我们完成了赋值操作。

下面通过一个完整的例子来实践一下吧,修改MainActivity.java中的代码:

package com.example.administrator.litepalsave;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import org.litepal.LitePal;
import org.litepal.crud.DataSupport;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "MainActivity";
    private Button btn_create, btn_add, btn_delete, btn_update, btn_query;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
    }

    private void initView() {
        btn_create = (Button) findViewById(R.id.btn_create);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_delete = (Button) findViewById(R.id.btn_delete);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_query = (Button) findViewById(R.id.btn_query);

        btn_create.setOnClickListener(this);
        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_query.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_create:
                createDatabase();//创建数据库
                Toast.makeText(this, "Create Database successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_add:
                addData();//添加数据
                Toast.makeText(this, "Add Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_delete:
                deleteData();//删除数据
                Toast.makeText(this, "Delete Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_update:
                updateData();//更新数据
                Toast.makeText(this, "Update Data successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_query:
                queryData();//查询数据
                Toast.makeText(this, "Query Data successfully", Toast.LENGTH_SHORT).show();
                break;
        }
    }


    private void createDatabase() {
        LitePal.getDatabase();//通过assets中的litepal.xml文件中的信息,创建BookStore数据库,并根据对象映射列表中的信息创建Book表
    }

    private void addData() {
        Book book = new Book();//创建Book实例
        book.setName("The Da Vinci Code");//设置书名
        book.setAuthor("Dan Brown");//设置作者
        book.setPages(454);//设置页数
        book.setPrice(16.96);//设置价格
        book.setPress("Unknow");//设置出版社
        book.save();//保存数据
    }

    private void updateData() {
        Book book = new Book();//创建Book实例
        book.setPrice(14.95);//设置价格
        book.setPress("Anchor");//设置出版社
        book.updateAll("name=? and author=?", "The Da Vinci Code", "Dan Brown");
    }

    private void deleteData() {
        DataSupport.deleteAll(Book.class, "pages < ?", "500");
    }

    private void queryData() {
        List<Book> books = DataSupport.findAll(Book.class);//获取Book表中数据,并且放入一个List集合
        //增强for遍历集合数据,并且打印
        for (Book book : books) {
            Log.e(TAG, "book name is " + book.getName());
            Log.e(TAG, "book author is " + book.getAuthor());
            Log.e(TAG, "book pages is " + book.getPages());
            Log.e(TAG, "book price is" + book.getPrice());
            Log.e(TAG, "book press is " + book.getPress());
        }
    }

}

运行程序之后先点击一下Add Data按钮,因为我们刚刚把数据给删除了,所以这里先添加数据,然后再点击Query Data按钮来查询数据。

因Book表中只有一条数据,所以我们只能查出这一条,如果有很多条其实都可以查出来的。

除了findAll()方法之外,LitePal还提供了很多其他非常有用的查询API。

比如我们想要查询Book表中的第一条数据就可以这样子写:

Book firstBook=DataSupport.findFirst(Book.class);

查询Book表中的最后一条数据就可以这样写:

Book lastBook=DataSupport.findLast(Book.class);

我们还可以通过连缀查询来定制更多的查询功能。

select()方法用于指定查询哪几列的数据,对应了SQL当中的select关键字。比如只查name和author这两列的数据,就可以这样子写:

List<Book> books=DataSupport.select("name","author").find(Book.class);

where()方法用于指定查询的约束条件,对应了SQL当中的where关键字。比如只查页数大于400的数据,就可以这样子写:

List<Book> books=DataSupport.where("pages > ?","400").find(Book.class);

order()方法用于指定结果的排序方式,对应了SQL当中的order by关键字。比如将查询结果按照书价从高到低排序,就可以这样子写:

List<Book> books=DataSupport.order("price desc").find(Book.class);

其中desc表示降序排列,asc或者不写表示升序排列。

limit()方法用于指定查询结果的数量,比如只查表中的前3条数据,就可以这样子写:

List<Book> books=DataSupport.limit(3).find(Book.class);

offset()方法用于指定查询结果的偏移量,比如查询表中的第2条、第3条、第4条数据,就可以这样写:

List<Book> books=DataSupport.limit(3).offset(1).find(Book.class);

由于limit(3)查询到的是前3条数据,这里我们再加上offset(1)进行一个位置的偏移,就能实现查询第2条、第3条、第4条的功能了。limit()和offset()方法共同对应了SQL当中的limit关键字。

当然,你还可以对这5个方法进行任意的连缀组合,来完成一个比较复杂的查询操作:

List<Book> books=DataSupport.select("name","author","pages")

.where("pages > ?","400")

.order("pages")

.limit(10)

.offset(10)

.find(Book.class);

 

猜你喜欢

转载自blog.csdn.net/android_studying/article/details/86538280