一.配置LitaPal
1.在Module的build.gradle配置LitePal
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'org.litepal.android:core:1.3.2'
}
2.配置litepal.xml文件
右击app/src/main/目录创建assets。在此目录下新建litepal.xml文件,文件内容如下
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list></list>
</litepal>
3.在清单文件中配置LitePalApplication
<application
android:name="org.litepal.LitePalApplication"
</application>
到此配置算完成了。
二.创建和升级数据库
1.创建数据库
新建一个数据库对应的类
package com.example.android.databasetest;
/**
* Created by Howy on 2017/3/23.
*/
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;
}
}
这个JavaBean类是用来映射对应的数据库表,就是对象关系映射ORM,LitePal框架就是采用这种方式创建数据库表的。
在MainActivity中添加一个按钮创建数据库
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// import org.litepal.tablemanager.Connector;如果配置好了,这个包会自动导入。
Connector.getDatabase();
}
});
2.升级数据库
给Book类中添加一个属性,同时往数据库里添加一张表Category,
新建Category类
package com.example.android.databasetest;
/**
* Created by Howy on 2017/3/23.
*/
public class Category {
private int id;
private String categoryName;
private int categoryCode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getCategoryCode() {
return categoryCode;
}
public void setCategoryCode(int categoryCode) {
this.categoryCode = categoryCode;
}
}
在litepal.xml文件中添加Category类与数据库的映射关系,同时将数据版本改为2
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="2"></version>
<list>
<mapping class="com.example.android.databasetest.Book"></mapping>
<mapping class="com.example.android.databasetest.Category"></mapping>
</list>
</litepal>
三.添加数据
首先修改Book类,当它继承LitePal包中的DataSupport
import org.litepal.crud.DataSupport;
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.setName("The Da Vinci Code");
book.setAuthor("Dan Brown");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unknow");
// new出一个对象,然后调用对象继承自DataSupport的save方法,将数据保存到数据库表中
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.00);
// 如果最后价格为10,就说明这是有效的更新
book.save();
对象是否已存储,根据book.isSave()判断,
第一种,如果对象调用过save(),就表示已存储,返回true
第二种,对象通过调用LitePal的API查询数据库中的对象,存在返回true
第一种
// 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.00);
// Log.d(TAG, "book.isSave() = [" + book.isSaved() + "]");
// // 如果最后价格为10,就说明这是有效的更新,book.isSave() = true;
// book.save();
//
// 第二种
Book book = new Book();
book.setPrice(14.95);
book.setPress("Anchor");
book.updateAll("name = ? and author = ?", "The Lost Symbol", "Dan Brown");
设置默认值并不是使用book.setXXX()方法,
而是book.setToDefault(“属性值”);
五.删除数据
第一种删除方法book.delete();
第二种删除方法 DataSupport.deleteAll(Book.class, String… conditions);
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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.delete();
// 下面这本存进去了,没有被删除
book.save();
// 使用指定删除条件来删除数据 DataSupport.deleteAll(Class<?> modelClass, String... conditions);
DataSupport.deleteAll(Book.class, "price < ?", "15");
}
});
六.查询数据
使用DataSupport.findAll(Book.class);方法
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 将查询的数据存了List集合中,并自动完成其中的赋值操作
List<Book> books = DataSupport.findAll(Book.class);
// 循环取出每个book对象具体数据(即数据表的每一列的具体数据)
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());
}
}
});
另外的一些LitePal有用的API
// 查询book表第一行数据
Book firstBook = DataSupport.findFirst(Book.class);
// 查询book表中所有的name和auther,相当于拼装成一张只有name和auther的表
List<Book> books = DataSupport.select("name", "auther").find(Book.class));
// 查询book表中 pages > 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(5).find(Book.class));
// 拼装原生的SQL语句查询,返回Cursor,还得按照之前那种麻烦的方法取出来
Cursor c = DataSupport.findBySQL();