LitePal
今天我学习了安卓的数据库,观看了郭霖老师篡写的《第一行代码》中讲述了LitePal,接下来我将讲述《第一行代码》中LitePal的有关对与LitePal的知识。
Litepal是一款android数据库框架,采用了对象关系映射(ORM)的模式。关系映射简单地说就是我们使用的编程语言是面向对象的编程语言,而使用的数据库是关系数据库,那么将面向对象的变成语言和面向关系的数据库之间建立一种映射关系,这就是对象映射关系。它可以让我们以面向对象的思维来操作数据库,而不用再和SQL语句打交道。Litepal将我们平时最常用到的一些数据功能进行了封装,使得我们不用编写一行SQL语句就可以完成各种建表和增删改查的操作。
1..配置LitePal
我查看了关于LitePal有的需要是下载jar包,这个可能有点麻烦,我们按照郭霖老师给我们的解释。
我们只需要在app/build.gradle文件中声明该开源库的引用。
我们需要找到它,然后在里面添加如下代码:
compile 'org.litepal.android:core:1.3.2'
接下来我们需要配置litepal.xml文件。
按照步骤创建一个assets目录,然后在assets目录下再新建一个litepal.xml文件:
在litepal.xml编写如下代码:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="3"></version>
<list>
<mapping class="com.example.litepal.Book"></mapping>
<mapping class="com.example.litepal.Category"></mapping>
</list>
</litepal>
讲解:
dbname 标签用于指定数据库名
version 标签用于指定数据库版本号
list 标签用于指定所有的映射模型(对象关系映射模式,具有很强大的功能,可以用面向对象的思维来操作数据库,我们就不再和SQL语句打交道了)
什么是对象关系映射?
我们使用的编程语言是面向对象语言,而使用数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射。
我们使用mapping标签声明我们要配置的映射模型类,注意一定要使用完整的类名。不管有多少模型类需要映射,都使用同样的方式配置在list标签下即可。(就是你创建程序的完整类名再加上你的数据库当中创建的表名)
我们首先定义一个Book类(直接理解就是创建一个表),代码如下:
public class Book extends DataSupport {
private int id;
private String author;
private double price;
private int pages;
private String name;
private String press;
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
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;
}
}
这就是和JSP中的JavaBean一样,在Book类中定义了id、author、price、pages、name这几个字段,并且生成了相应的getter和setter方法。Book类中的没哟个字段分别对应了表中的每一列,这就是对象关系映射最直接的体验。
1.编写代码
首先我们在创建的安卓项目中xml文件中编写如下代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database"
/>
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"
/>
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新"
/>
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除"
/>
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询"
/>
</LinearLayout>
我们创建了几个按钮用来实现LitePal实现发功能。
然后在java中编写如下代码:
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
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) {
Connector.getDatabase();//理解为连接数据库
}
});
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");
book.save();//保存
}
});
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 Da Vinci Code");
book.setAuthor("Dan Brown");
book.setPages(454);
book.setPrice(16.96);
book.setPress("Unknow");
book.save();
book.setPrice(10.99);
book.save();
/* Book book=new Book();
book.setParice(14.95);
book.setPress("Anchor");
book.updateAll("name=? and author=?","The Lost Symbol","Dan Brown");
*/
}
});
Button deleteDate=(Button)findViewById(R.id.delete_data);
deleteDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataSupport.deleteAll(Book.class,"price<?","15");
}
});
Button queryButton=(Button)findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<Book> books=DataSupport.findAll(Book.class);
//findAll()方法的返回值是一个Book类型的List集合,
//我们不需要在通过Cursor对象一行行去取值了,
//LitePal已经自动帮我们完成了复制操作
for (Book book:books){
Log.d("MainActivity","book name is "+book.getName());
Log.d("MainActivity","book author is "+book.getAuthor());
Log.d("MainActivity","book page is "+book.getPages());
Log.d("MainActivity","book price is "+book.getPrice());
Log.d("MainActivity","book press is "+book.getPress());
}
}
});
}
}
在这里我简单介绍一些LitePal中有用的查询API:
比如我们要查询Book表中的第一条数据就可以这样写:
Book first Book=DataSupport.findFirst(Book.class);
同理我们要查询最后一条数据就可以这样写:
Book first Book=DataSupport.findLast(Book.class);
我们还可以通过连缀查询来定制更多的查询功能。
select()方法用于指定查询哪几列的数据,对应SQL当中的select关键字。比如只查name和author这两列的数据,就可以这样写:
where()方法用于指定查询的约束条件,对应了SQL当中的where关键字。比如只查页数大于400的数据,就可以这样写:
好了,这就是关于LitePal的简单理解(我写的主要是郭霖老师编写的《第一行代码》中关于LitePal的讲解)。如有不妥,请告诉我。