持久化技术——使用LitePal操作数据库

LitePal是一款开源的Android数据库框架,采用了对象关系映射的模式。

LitePal的项目主页上有详细的使用文档,地址为http://github.com/LitePalFramework/LitePal。

配置LitePal

  1. 在app/buile.gradle文件中声明该开源库的引用。
    在dependencies闭包中添加该内容
compile 'org.litepal.android:core:1.6.1'
  1. 配置litepal.xml文件。
    右击app/src/main目录–>New–>Floder–>AssetFloder,创建一个assets目录,然后在assets目录下新建一个litepal.xml文件。
    关于建立litepal.xml文件,我真的用了挺久(笑哭),先右击assets,选择New Resource Diectory新建litepal.xml,然后这个xml文件就出现在了res目录下的layout(就是这么dt),然后我就把它强行拉到了assets目录下(卑微)
    编辑litepal.xml
  • dbname标签用于指定数据库名
  • version标签用于指定数据库版本号
  • list标签用于指定所有的映射模式
<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value = "BookStore"></dbname>
    <version value = "1"></version>
    <list></list>
</litepal>
  1. 配置LitePalApplication
    在AndroidMainfest.xml的application中添加以下内容,让LitePal的所有功能可正常工作。
 android:name="org.litepal.LitePalApplication"

创建和升级数据库

创建

  1. 编辑activity_main.xml
    也就是创建、添加、更新、删除、查询数据库的按钮。
<Button
        android:id="@+id/creat_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Creat database"/>
    <Button
        android:id="@+id/add_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add database"/>
    <Button
        android:id="@+id/updata_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Updata database"/>
    <Button
        android:id="@+id/delet_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delet_database"/>
    <Button
        android:id="@+id/query_database"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Query database"/>
  1. 执行建表语句,定义Book类。
    这是一个典型的Java bean。
    Book类就会对应数据库中的Book表,而类中的每一个字段分别对应表中的每一个列。
package com.example.litepaltest;

/**
 * Created by lenovo on 2019/6/11.
 */

public class Book {
    private int id;
    private String author;
    private double price;
    private double pages;
    private String name;
    
    public void setId(int id){
        this.id = id;
    }
    public void setAuthor(String author){
        this.author = author;
    }
    
    public void setPrice(double price){
        this.price = price;
    }
    
    public void setPages(double pages){
        this.pages = pages;
    }
    
    public void setName(String name){
        this.name = name;
    }

    public int getId(int id){
        return this.id;
    }
    public String getAuthor(String author){
        return this.author;
    }

    public double getPrice(double price){
        return this.price;
    }

    public double getPages(double pages){
        return this.pages;
    }

    public String getName(String name){
        return this.name;
    }
}

  1. 将Book类添加到映射模型列表中。
    修改litepal.xml。
    mapping标签声明我们要配置的映射模型类,一定要使用完整类名。
 <list>
        <mapping class = "com.example.litepaltest.Book"></mapping>
    </list>
  1. 修改MainActivity代码,进行任意一次数据库操作。
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.creat_database);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Connector.getDatabase();//一次最简单的操作
            }
        });
    }

升级
只需要改你想改的任何内容,然后将版本号加一。

  1. 修改内容。
    比如想象Book表中添加出版社press列,直接修改Book类中的代码。
...
private String press;
...
public void setPress(String press){
   this->press = press;
   }
...
poublic String getPress(){
     return this->press;
 }

比如还想再一个Category表,只需新建一个Category类就可以。

  1. 修改litepal.xml。
<version value = "2"></version>
<list>
    <mapping class = "com.example.litepaltest.Book"></mapping>
    <mapping class = "com.example.listpal.category"></mapping>
</list>

添加数据

只需要创建出模型类的实例,再将所有要存储的数据设置好,之后调用save()方法即可。

  1. 让Book继承DataSupport。
    LitePal进行CRUD操作时必须继承DataSuport类。
    save()方法来自DataSupport类。

  2. 向Book表中添加数据,修改MainActivity.


        //添加数据
        Button button1 = (Button)findViewById(R.id.add_database);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setId(1);
                book.setAuthor("马克.李维");
                book.setName("偷影子的人");
                book.setPages(500);
                book.setPrice(35.5);
                book.save();//数据添加操作,save()方法继承自DataSupport
            }
        });

更新数据

方式一:对已存储的对象重新设值,然后重调save()方法。

已存储对象:对于LitePal来说,对象是否存储根据调用**model.isSaved()**方法的结果来判断,返回true表示已存储。

model.isSaved()返回true:已调用过model.save()方法添加数据;model对象是通过LitePal提供的API查出来的(暂时通过第一种情况验证)。

//更新数据
        Button button2 = (Button)findViewById(R.id.updata_database);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setId(2);
                book.setAuthor("麦克福尔");
                book.setName("摆渡人");
                book.setPages(700);
                book.setPrice(46.7);
                book.save();
                book.setPrice(30.0);
                book.save();
            }
        });

在第二次调用save()方法时,LitePal会发现当前对象已存储,不会再向数据库中添加一条数据,而是更新数据。

方式二:首先new出一个Book实例,然后直接调用具体方法设置要更新的数据,最后调用updataAll()执行更新操作。

//更新数据
        Button button2 = (Button)findViewById(R.id.updata_database);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setPrice(28.6);
                book.updateAll("name = ? author = ?","偷影子的人","马克.李维");//如果不指定条件语句,就默认更新所有数据
            }
        });

使用updataAll()方法将数据更新为默认值:不能直接将值设为0或null或false等,而是使用**setToDefault()**方法,传入相应的列名。

例:

Book book = new Book();
book.setToDefault("pages");
book.updataAll();

删除数据

方式一:已存储数据直接调用delet()方法。
方式二:DataSupport.deleteAll()方法,第一个参数指定删除哪张表的数据,后面参数用于指定约束条件。

//删除数据
        Button button3 = (Button)findViewById(R.id.delet_database);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DataSupport.deleteAll(Book.class,"price < ?","15");//删除Book表中价格低于15的书
            }
        });

查询数据

  1. 查询表中所有数据------finaAll()方法:参数用来指定查询哪个表,返回值是一个List集合。

例:查询Book表中的所有数据。

List<Book> books = DataSupport.findAl(Book.class);
  1. 查询表中第一条数据----findFirst()
Book firstBook = DataSupport.findFirst(Book.class);
  1. 查询表中最后一条数据----findLast()
Book findLast = DataSupport.findLast(Book.class);
  1. 通过连缀查询指定更多的查询功能

select():指定查询哪几列

List<Book> books = DataSupport.select("name","author").find(Book.class);//只查name和author这两列数据

where():指定查询的约束条件

List<Book> books = DataSupport.where("pages>?","400").find(Book.class);//只查页数大于400的数据

order():指定结果的排序方式,desc表示降序排列,asc或者不写表示升序排列

List<Book> books = DataSupport.order("price desc").find(Book.class);//查询结果按书价从高到低排序

limit():指定查询结果的数量

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

offest():指定查询结果的偏移量

List<Book> books = DataSupport.limit(3).dffset(1).find(Book.class);//查询表中的第2、3、4条

猜你喜欢

转载自blog.csdn.net/weixin_42937036/article/details/91485436