LitePal

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

配置LitePal
编辑app/build.gradle文件,在dependencies闭包中添加LitePal的开源库。后面右击app/src/main/目录->New->Directory,创建一个asserts目录,然后再asserts目录下再新建一个litepal.xml文件,接着编辑内容。标签用于指定数据库名,标签用于指定数据库版本号,标签用于指定所有的映射类型。

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore" />
    <version value="1" />
    <list>
        <mapping class="com.example.litepaltest.Book"></mapping>
        <mapping class="com.example.litepaltest.Category"></mapping>
    </list>
</litepal>

然后我们要将项目的application配置为org.litepal.LitePalApplication,这样才能让LitePal的所有功能正常工作。

<application
        android:name="org.litepal.LitePalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.LitePalTest">
        <activity android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
</application>

创建和升级数据库

首先定义一个类,与数据库中的一张表对应,此处举例Book类,对应数据库中的Book表。然后在litepal.xml文件中,将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;
    }
    ...
}

接着,创建数据库,代码很简单。可以用“adb shell”相关命令进入到项目的数据库中查看结果。

LitePal.getDatabase();

原先使用SQLiteOpenHelper升级数据库要先把之前的表drop掉,然后再重新创建,这其实是一个非常严重的问题,因为这样会造成数据丢失,每升级一次数据库,之前表中的数据就全没了。虽然可以使用逻辑控制来避免这个问题,但过程比较复杂。而使用LitePal升级数据库非常简单,你完全不用思考任何逻辑,只需要修改你想修改的内容,然后将版本号加1就行了。这里我们举一个例子,增加Book表中一个出版社的字段,新增一张Category表。

public class Book  {
    ...
   private String press;

    ...
   public String getPress() {
        return press;
    }

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

public class Category {

    private int id;
    private String categoryName;
    private int categoryId;

    public int getId() {
        return id;
    }

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

    ...
}

接着我们将版本号加1,然后将新的模型类添加到映射列表中,执行LitePal.getDatabase()就可以了。

LitePal进行CRUD操作,必须要让模型类继承DataSupport才行。所以,首先我们让Book继承DataSupport类。

public class Book extends DataSupport {
  ...
}

添加数据

Book book = new Book();
book.setName("The Da Vinci Code");
book.setAuthor("Dan Brown");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unknow");
book.save();

更新数据

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();

设置默认值(所有字段都有默认值,比如String类型为null,boolean类型为false,int为0),如果updateAll()没有指定约束条件,则对所有数据生效。

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

另外一种比较灵巧的更新方式

Book book = new Book();
book.setPrice(14.95);
book.setPress("Anchor");
book.updateAll("name = ? and author = ?", "The Lost Symbol", "Dan Brown");

删除数据

DataSupport.deleteAll(Book.class, "price < ?", "15"); //如果deleteAll不指定约束条件,意味着你要删除表中的所有数据

查询数据

List<Book> books = DataSupport.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 press is " + book.getPress());
 Log.d("MainActivity", "book pages is " + book.getPages());
 Log.d("MainActivity", "book price is " + book.getPrice());
                }

其他查询API

//查询Book表中的第一条数据
Book firstBook = DataSupport.findFirst(Book.class);
//查询Book表中的最后一条数据
Book lastBook = DataSupport.findLast(Book.class);
//查询Book表中name和author这两列的数据
List<Book> books = DataSupport.select("name", "author").find(Book.class);
//查询Book表页数大于400的数据
List<Book> books = DataSupport.where("pages>?", "400").find(Book.class);
//查询结果按照书价从高到低排序
List<Book> books = DataSupport.order("price desc").find(Book.class);
//查询第二条、第三条、第四条的数据
List<Book> books = DataSupport.limit(3).offset(1).find(Book.class);
//五个方法连缀组合,完成一个复杂的查询                
List<Book> books = DataSupport.select("name","author","pages")
     .where("pages>?","400")
     .order("pages")
     .limit(10)
     .offset(10)
     .find(Book.class);

当然,LitePal也支持原生的SQL来进行查询

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

LitePal

上一篇:使用 rsync 备份/复制 系统


下一篇:码云官网gitee.com 打不开