Android——LitePal数据库框架的基本用法

一、LitePal简介

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

那么什么是对象关系映射呢?简单来说,我们使用的编程语言是面向对象语言,而数据库则是关系型数据库,那么在面向对象的语言和面向关系的数据库之间建立的映射关系,就是对象关系映射了。对象关系映射模式使得我们可以用面向对象的思维来操作数据库,而不需要再使用SQL语句。

LitePal项目的地址是:https://github.com/LitePalFramework/LitePal。我们可以通过这个网站查询LitePale框架的使用手册以及最新版本等信息。

二、配置LitePal

由于现在大多数开源项目都会将版本提交到jcenter上,所以我们当需要使用开源库的时候,只需要在app/build.gradle文件中声明开源库的引用即可。

如配置LitePal,只需要编辑app/build.gradle文件,在dependencies闭包中添加如下引用即可:

implementation 'org.litepal.android:core:1.3.2'

在这段引用中,1.3.2是开源库的版本号,我们可以在LitePal项目主页上查看最新版本,而前面的则是固定的格式。

 

这样我们就成功地引入LitePal到项目中了。然后我们需要配置litepal.xml文件:在app/src/main目录右键,New->Directory,新建一个assets文件夹,然后右键assets文件夹新建一个xml文件:New->File,输入litepal.xml,然后在litepal中添加如下内容:

<?xml version ="1.0" encoding ="utf-8"?>
<litepal>
    <dbname value="BookStore" ></dbname>

    <version value="1" ></version>

    <list>
        
    </list>
</litepal>

其中<dbname>标签指定的是数据库名,<version>指定的是数据库版本号,<list>则用于指定所有的映射模型

最后还要配置一下LitePalApplication,修改AndroidManifest.xml中的代码,在<application>中添加代码:

android:name="org.litepal.LitePalApplication"

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

三、创建数据库和更新

因为LitePal采用的是对象关系映射模式,它有一个强大的功能,就是可以用面向对象的思维来操作数据库,而不用和SQL语句打交道。

下面我们创建一个LitePalTest项目。首先创建一张Book表,因为我们引入了LitePal,所以不需要编写SQL语句来进行数据库操作,而是在MainActivity.java同目录下创建一个Book类:

package com.example.litepaltest;

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;
    }
}

(在定义好所有属性后,可以按Alt + Insert键,选择Getter and Setter则可以自动生成Getter、Setter方法)

Book类对应了数据库中的Book表,Book类中定义的每个字段则代表了数据库中的每一列。

在定义好Book类后,还需要将Book类添加到映射模型列表中:修改litepal.xml中的代码,在<list>标签中添加

<mapping class="com.example.litepaltest.Book"></mapping>

litepal.xml

<?xml version ="1.0" encoding ="utf-8"?>
<litepal>
    <dbname value="BookStore" ></dbname>

    <version value="1" ></version>

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

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

然后只需要进行任意一次数据库操作就可以创建BookStore.db数据库了。

首先创建一个含有触发创建数据库按钮的布局:

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

    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database"
        />

</LinearLayout>

然后修改MainActivity中的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Connector.getDatabase();
                Toast.makeText(MainActivity.this, "create database success", Toast.LENGTH_LONG).show();
            }
        });
    }
}

点击按钮后调用getDatabase()方法,即可自动创建数据库。

那么,如果我们想要更新数据库怎么办呢?

这个也很简单,我们只需要直接在想要修改的映射类中修改,比如我想要给Book表添加一个Press属性,并且添加一个Category表,那么首先直接在Book类中添加声明:private String press; 然后添加好setter和getter方法,然后新建Category类:

public class Category {
    private int id;
    private String categoryName;
    private int categoryCode;

    public int getId() {
        return id;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public int getCategoryCode() {
        return 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;
    }
}

在进行完修改后,还有最后一步,就是修改litepal.xml文件

<?xml version ="1.0" encoding ="utf-8"?>
<litepal>
    <dbname value="BookStore" ></dbname>

    <version value="2" ></version>

    <list>
        <mapping class="com.example.litepaltest.Book"></mapping>
        <mapping class="com.example.litepaltest.Category"></mapping>
    </list>
</litepal>

因为Category是新添加的映射类,所以需要添加到映射模型列表中,在<list>标签中添加<mapping>进行标注,然后在<version>标签中把value值改为原来的值+1,代表为新版本的数据库。这样再次点击创建数据库按钮的时候系统就会自动更新数据库了,而原本数据库中的数据LitePal也会自动帮我们保存好了。

四、添加数据

使用LitePal对数据库中的表进行添加数据操作比较简单,主要是对表的映射类进行setter方法的操作,最后调用save()方法即可保存数据。

使用LitePal对表进行CRUD操作的时候,必须要模型类继承自DataSupport类。

首先修改Book类的代码:

public class Book extends DataSupport { ..... };

然后添加一个触发添加数据操作的按钮:

<Button
    android:id="@+id/add_data"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Add data"/>

最后在MainActivity中添加按钮触发事件:

Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setName("The universe in the shell");      //添加第一组数据
                book.setAuthor("Hawking");
                book.setPages(150);
                book.setPrice(19.9);
                book.setPress("People's Publishing House");
                book.save();

                Book book1 = new Book();
                book1.setName("A Brief History of Universe");    //添加第二组数据
                book1.setAuthor("Stephen");
                book1.setPages(659);
                book1.setPrice(58);
                book1.setPress("China renmin University press");
                book1.save();

                Toast.makeText(MainActivity.this, "add data success", Toast.LENGTH_SHORT).show();
            }
        });

设置完数据后的save()方法就是继承自DataSupport类的。

五、查询数据

查询数据一直是数据存储中最复杂的部分,不过因为DataSupport类提供了很多查询方法,使得在LitePal中查询数据简单了许多。

首先也是在布局中添加查询按钮:

<Button
   android:id="@+id/query_data"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="Query data"/>

然后在MainActivity中添加该按钮的点击事件 :

Button queryData = (Button) findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        List<Book> books = DataSupport.findAll(Book.class);     //查询所有数据
//       Book firstBook = DataSupport.findFirst(Book.class);     //查询表中第一条数据
//       Book lastBook = DataSupport.findLast(Book.class);       //查询表中最后一行数据
//       List<Book> books = DataSupport.select("name", "author").find(Book.class);     //select()方法查询数据
//       List<Book> books = DataSupport.where("pages > ?", "400").find(Book.class);      //where()方法查询数据
//       List<Book> books = DataSupport.order("price desc").find(Book.class);       //order()方法排序
//       List<Book> books = DataSupport.limit(3).find(Book.class);     //指定查询结果数量
//       List<Book> books = DataSupport.limit(3).offset(1).find(Book.class);     //指定查询结果数量及偏移量(显示第2、3、4条数据)
         /*List<Book> books = DataSupport.select("name", "author", "pages")    //查询Book表中第2-3条页数大于50的name、author、
                                         .where("pages > ?", "50")             //pages这三列数据,并按照页数从小到大排列显示出来
                                         .order("pages")
                                         .limit(2)
                                         .offset(1)
                                         .find(Book.class);*/

        for(Book book: books) {     //遍历List集合中的Book对象
            Log.d("MainActivity", "book name is " + book.getName());
            Log.d("MainActivity", "book author is " + book.getAuthor());
            Log.d("MainActivity", "book pages is " + book.getPages());
            Log.d("MainActivity", "book price is " + book.getPrice());
            Log.d("MainActivity", "book press is " + book.getPress());
        }
        Toast.makeText(MainActivity.this, "query data success", Toast.LENGTH_SHORT).show();
    }
});

LitePal的查询API基本上就在以上的代码中了,这些查询方法可以单独使用,如果需要组合使用的话直接在.find(Book.class)方法前连缀即可。

如果你喜欢使用原生的SQL代码来进行查询,没关系,LitePal仍然支持使用原生的SQL来进行数据查询。

Cursor c = DataSupport.findBySQL("select * from Book where pages > ? and price < ?", "200", "40");

调用DataSupport.findBySQL()方法来进行原生查询,第一个参数输入SQL语句,后面的参数用于指定占位符的值。需要注意的是findBySQL()方法返回的是Cursor对象,如果需要取出数据则要通过遍历Cursor对象和调用get方法。

六、更新数据

更新数据,首先需要做的是判断这个数据是否已经存储。对于LitePal来说,对象是否已存储通过model.isSaved()方法的返回值来判断。而model.isSaved()方法返回true的只有两种情况,一种是model已经调用过model.save()方法来存储数据,另一种是model是通过LitePal的查询API查询出来的。

首先添加一个按钮update_data

<Button
    android:id="@+id/update_data"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Update data"/>

对于对于已经调用过model.save()方法来判断是否已存储数据这种情况,可以对对象中的属性进行修改后,再次调用save()方法进行存储,这样就可以成功更新数据了。不过这种方式只能对已存储的数据进行更新,限制性比较大,不够灵活。

修改MainActivity:

Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        Book book = new Book();       //方法一:通过多次调用model.save()方法来更新数据
        book.setName("A Brief History Of Time");
        book.setPress("China renmin University press");
        book.setPrice(19.9);
        book.setPages(163);
        book.setAuthor("Hawking");
        book.save();
        book.setPrice(29.9);
        book.save();

        Toast.makeText(MainActivity.this, "update data success!", Toast.LENGTH_SHORT).show();
    }
});

在点击update按钮后,再点击query按钮,查看log

price为29.9,说明更新数据成功。

更新数据的另一种方法是使用DataSupport.updateAll方法进行数据更新。

修改MainActivity:

Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        Book book = new Book();         //方法二:通过查询数据库来更新数据
        book.setPrice(39.9);
        book.setPages(250);
        book.updateAll("name = ? and author = ?", "The universe in the shell", "Hawking");
    }
    Toast.makeText(MainActivity.this, "update data success!", Toast.LENGTH_SHORT).show();
});

这个方法时首先通过book对象进行set方法操作,然后通过updateAll()方法对符合条件的数据进行数据更新,如果updateAll()方法中没有内容,则默认为更新全部数据。

使用updateAll()方法有一个需要注意的地方就是,如果是想将某个字段的值更新为该字段类型的默认值,比如int类型的0,Boolean类型的false,String类型的null,那么直接使用.set()方法是不行的。比如想把book对象的pages设置为0,那么无论pages目前是否为0,如果使用book.setPages(0)的话,LitePal是不会对这个字段进行更新的。如果想要将某些字段更新为默认值,LitePal提供了一个专门的方法:setToDefault(),需要使用这个方法的时候只需要传入想要更新为默认值的字段名即可。

如刚才提到的例子:想把pages更新为0:

Book book = new Book();
book.setToDefault("pages");
book.updateAll();    //没有条件,默认把所有数据的pages更新为0

七、删除数据

LitePal中删除数据和更新数据一样,也有两种方法。

第一种方法类似于更新数据中的第一种方法,调用已存储对象的delete方法,但是这种方法不够灵活。还可以使用第二种方法:调用DataSupport.deleteAll()方法进行数据删除,deleteAll()方法中传入指定的数据表、约束条件以及约束条件参数。代码如下:

在布局中添加触发删除数据操作的按钮:

<Button
    android:id="@+id/delete_data"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Delete data"/>

在MainActivity中添加按钮点击事件:

Button deleteData = (Button) findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        /*Book book = new Book();     //方法一:调用已存储对象的delete方法
        book.setName("A Brief History Of Time");
        book.setPress("China renmin University press");
        book.setPrice(19.9);
        book.setPages(163);
        book.setAuthor("Hawking");
        book.save();
        book.delete();*/

        DataSupport.deleteAll(Book.class, "price < ?", "40"); //方法二:调用DataSupport.deleteAll()方法
        Toast.makeText(MainActivity.this, "Delete data succes!", Toast.LENGTH_SHORT).show();
    }
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值