LitePal是一款开源的android数据框架,它采用了对象关系映射(ORM)的模式,并且我们平时开发最常用的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种间表和增删改查的操作。它的项目主页上也有详细的使用文档
配置LitePal
声明开源库引用
大多数开源项目都会将版本提交到jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以了。
在dependencies闭包中添加org.litepal.android:core:1.4.1
:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
compile 'org.litepal.android:core:1.4.1'
}
配置litepal.xml
在app/src/main目录下新建assets目录,在assets目录下新建litepal.xml文件
<?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中的代码
<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>
创建和升级数据库
LitePal采取的对象关系映射的模式,那么什么是对象关系映射(ORM)呢?简单点说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系数据库之间建立的一种映射关系,这就是对象映射关系。(还记得服务器等很多地方都有ORM思想)
不过你可不要小看对象关系映射模式,它赋予了我们一个强大的功能,就是可以用面向对象的思想来操作数据库。新建Book类:
public class Book{
private int id;
private String author;
private double price;
private int pages;
private String name;
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
修改litepal.xml中的代码
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list>
<mapping class="com.example.a51104.litepaltest.Book"></mapping>
</list>
</litepal>
修改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) {
LitePal.getDatabase();//相当于调用onCreate()或者onUpgrade()
}
});
}
}
当我们想要修改数据库内容时,直接修改类的内容(如增加或者删除列)、新建类(增加表)等。然后修改版本号后重新建库。当然LitePal还自动帮我们做完项非常重要的工作,就是保留之前表中的所有数据,这样就再也不用担心数据丢失的问题。
使用LitePal添加数据
- 创建出模型类的实例,将需要存储的信息设置好后调用save()方法
- 进行CRUD操作时需要继承DataSupport类
public class Book extends DataSupport{
...
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
Button addData=(Button)findViewById(R.id.insert_database);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book=new Book();
book.setName("Android Studying");
book.setAuthor("G");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unknow");
book.save();
}
});
}
}
使用LitePal更新数据
已存储对象:model.isSaved()被用来判断是否已存储。在两种情况下会返回true:一种是已经调用了model.save()方法去添加数据了,此时model会被认为是已存储的对象。另一种情况是model对象是通过LitePaal提供的查询API查到的对象。
修改已经存储的对象,方法一
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book=new Book();
book.setName("Android Studying2");
book.setAuthor("G2");
book.setPages(510);
book.setPrice(19.95);
book.setPress("Unknow");
book.save();
book.setPrice(10.99);
book.save();
//更新成默认值的操作,默认值是不能直接set的可以通过这个方法指定列名进行操作
// Book book=new Book();
// book.setToDefault("pages");
// book.updateAll();
}
});
}
方法二
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Book book=new Book();
book.setPrice(14.95);
book.setPress("Author");
book.updateAll("name=? and author=?","Android Studying","G");
}
});
}
使用LitePal删除数据
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataSupport.deleteAll(Book.class,"price<?","15");
}
});
使用LitePal查询数据
查询所有行
List<Book> books=DtaSupport.findAll(Book.class);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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 pages is "+book.getPages());
Log.d("MainActivity","book price is "+book.getPrice());
Log.d("MainActivity","book press is "+book.getPress());
}
}
});
功能 | 代码 |
---|---|
查询表所有行 | 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) |
查询指定的约束条件 | 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).find(Book.class) |
指定查询结果的偏移量 | List<Book> books=DataSupport.limit(3).offset(1).find(Book.class) |
当然这些可以组合起来(流模式),形成强大的查询功能
SQL语言
Cursor cursor=DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20");