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

Android学习|LitePal操作数据库

程序员文章站 2022-06-01 21:02:14
...

《第一行代码》系列读书笔记
1.LitePal简介
2.配置LitePal
3.创建和升级数据库
4.添加数据
5.更新数据
6.删除数据
7.查询数据


1.LitePal简介

  • LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。
    什么是关系映射,简单的说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射了,对象关系映射模式,就是可以用面向对象的思维来操作数据库,而不用再和SQL语句打交道。

2.配置LitePal

  • 1.编辑app/build.gradle文件,在dependencies闭包中添加如下内容:

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:25.3.1'
        testCompile 'junit:junit:4.12'
        compile 'org.litepal.android:core:1.4.1'//版本号
    }
    

    2.配置litepal.xml文件,右击app/src/main目录–New–Directory,创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件,然后编辑

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

    3.配置一下LitePalApplication,修改AndroidManifest.xml中的代码

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.litepaltest">
    <application
        android:name="org.litepal.LitePalApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
        </application>
    </manifest>
    

    这里将项目的application配置为org.litepal.LitePalApplication。

3.创建和升级数据库

  • 使用LitePal,用面向对象的思维来创建一张Book表,定义一个Book类,代码如下:

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

    这是一个典型的Java bean,Book类对应数据库中的Book表,而类中的每一个字段分别对应了表中的每一个列。
    把Book类添加到映射模型列表当中,修改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>
    

    修改MainActivity代码

    Button createDatabase = (Button)findViewById(R.id.create_database);
    createDatabase.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Connector.getDatabase();
            //简单的数据库操作,只要点击一下按钮,数据库就会自动创建完成.
        }
    });
    

    使用SQLiteOpenHelper升级数据库,有一个问题就是升级数据库的时候我们需要先把之前的表drop掉,然后再重新创建才行,这其实是一个非常严重的问题,因为这样会造成数据丢失,每当升级一次数据库,之前表中的数据就全没了。
    当使用LitePal时,这些都不再是问题了.使用LitePal来升级数据库非常非常简单,你完全不用考虑任何的逻辑,只需要改你想改的内容,然后版本号加1就可以了

    比如我们想要向Book表中添加一个press(出版社)列,直接修改Book类中的代码,添加一个press字段

    public class Book {
        ...
        private String press;
        ...
    
        public String getPress() {
            return press;
        }
    
        public void setPress(String press) {
            this.press = press;
        }
    }
    

    如果我们还想再添加另一张表,那么只需要新建一个类就可以了
    改完了所有我们想改的东西,只需要记得将版本号加1就行了.这里添加一个新的模型类,因此也需要将它添加到映射模型列表中,修改litepal.xml中的代码。

4.使用LitePal添加数据

  • 使用LitePal添加数据,只需要创建出模型类的实例,然后将所有的要存储的数据设置好,最后调用一下save()方法就可以了
    模型类必须继承DataSupport类,修改Book类

    public class Book extends DataSupport{
        ...
    }
    

    修改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实例
            book.setName("The Da Vinci Code");
            book.setAuthor("Dan Brown");
            book.setPages(454);
            book.setPrice(16.96);
            book.setPress("Unknow");
            book.save();  //数据添加
        }
    });
    

5.使用LitePal更新数据

  • 首先,最简单的一种更新方式就是对已存储的对象重新设值,然后重新调用save()方法。什么是已存储的对象,对于LitePal来说,对象是否已存储就是根据调用**model.isSaved()**方法的结果来判断的,返回true就表示已存储,返回false就表示未存储。

    第一种情况的代码,修改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.setName("The Lost Symbol");
            book.setAuthor("Dan Brown");
            book.setPages(510);
            book.setPrice(19.95);
            book.setPress("Unknow");
            book.save();
            book.setPrice("10.99");
            book.save();
        }
    });     
    

在更新数据按钮的点击事件里面,首先添加一条Book数据,然后调用setPrice()方法将这本书的价格进行修改,之后再调用了**save()**方法.此时LitePal会发现当前的Book对象是已存储的,因此不会再向数据库中去添加一条新的数据,而是会直接更新当前的数据.

另外一种更新方法,修改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(14.95);
           book.setPress("Anchor");
           book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
       }
   });
   }

这里首先new一个Book实例,然后直接调用setPrice()方法和setPress()方法来设置要更新的数据,最后再调用*updateAll()方法去执行更新操作。
对于所有想要将为数据更新成默认值的操作,LitePal提供了一个
setToDefault()*方法,然后传入相应的列名就可以了实现了。

6.使用LitePal删除数据

  • 第一种是直接调用已存储对象的delete()方法就可以了。 另一种删除方式的代码如下: 修改MainActivity代码:

    Button deleteButton = (Button)findViewById(R.id.delete_data);
    deleteButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            DataSupport.deleteAll(Book.class,"price < ?","15");
        }
    });
    }
    

    这里调用DataSupport.deleteAll()方法来删除数据,其中deleteAll()方法的第一个参数用于指定删除哪张表中的数据,后面的参数用于指定约束条件。
    deleteAll()方法不指定约束条件,就是要删除表中的所有数据

7.使用LitePal查询数据

  • LitePal查询表中的所有数据:

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

    findAll()方法返回一个Book类型的List集合,我们不用像之前那样通过Cursor对象一行行去取值,LitePal已经自动帮助我们完成了赋值操作.
    修改MainActivity代码:

    Button queryButton = (Button)findViewById(R.id.query_data);
    queryButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            List<Book> books = DataSuppport.findAll(Book.class);
            for(Book book:books){
                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());
            }
        }
    });
    }
    

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

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

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

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

    我们可以通过连缀查询来定制更多的查询功能
    select()方法用于指定查询那几列的数据,对应了SQL当中的select关键字,比如只查询name和author这两列的数据

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

    where()方法用于指定查询的约束条件,对应了SQL当中的关键字where,比如只查询页数大于400的数据,

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

    order()方法用于指定结果的排序方式,对应了SQL当中的order by 关键字,比如将查询结果按照书价格从高到低排序
    desc表示降序排列,asc或者不写表示升序排列

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

    limit()方法用于指定查询结果的数量,比如只查询表中的前3条数据

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

    offset()方法用于指定查询结果的偏移量,比如查询表中的第2条,第3条,第4条数据

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

    还可以对这5个方法进行任意组合的连缀,来完成一个比较复杂的查询操作
    查询Book表中第11–20条满足页数大于400这个条件的name,author和pages这3列数据,并将查询结果按照页数升序排列

    List<Book> books = DataSuppport.select("name", "author", "pages")
                       .where("pages > ?", "400")
                       .order("pages")
                       .limit(20)
                       .offset(10)
                       .find(Book.class);
    

    LitePal也支持使用原生的SQL来查询:

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

    调用DataSupport.findBySQL()方法来进行原生查询,其中第一个参数用于指定SQL语句,后面的参数用于指定占位符的值,注意findBySQL()方法返回的是一个Cursor对象,需要将数据一一取出才行。