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