Room简化数据库操作
使用数据库帮助器编码的时候,开发者每次都得手工实现以下代码逻辑:
-
重写数据库帮助器的onCreate方法,添加该表的建表语句;
-
在插入记录之时,必须将数据实例的属性值逐一赋给该表的各字段;
-
在查询记录之时,必须遍历结果集游标,把各字段值逐一赋给数据实例;
-
每次读写操作之前,都要先开启数据库连接;读写操作之后,又要关闭数据库连接
Room框架的导入
在使用Room之前,要先修改模块的 build.gradle 文件,往 dependencies 节点添加下面两行配置,表示导入指定版本的Room库:
-
implementation 'androidx.room:room-runtime:2.3.0'
-
annotationProcessor 'androidx.room:room-compiler:2.3.0'
Room框架编码步骤
以录入书籍信息为例,使用Room框架的编码过程分为下列五步:
-
编写书籍信息表对应的实体类,该类添加“@Entity”注解。
-
编写书籍信息表对应的持久化类,该类添加“@Dao”注解。
-
编写书籍信息表对应的数据库类,该类从RoomDatabase派生而来,并添加“@Database”注 解。
-
在自定义的Application类中声明书籍数据库的唯一实例。
-
在操作书籍信息表的地方获取数据表的持久化对象
程序
接口:
dao / BookDao.java
package com.example.datastorage.dao;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import com.example.datastorage.enity.BookInfo;
import java.util.List;
@Dao
public interface BookDao {
/**
* 可变参数 ...
*
* @param book
*/
@Insert
void insert(BookInfo... book);
@Delete
void delete(BookInfo... book);
// 删除所有书籍信息
@Query("DELETE FROM BookInfo")
void deleteAll();
@Update
int update(BookInfo... book);
// 加载所有书籍信息
@Query("SELECT * FROM BookInfo")
List<BookInfo> queryAll();
// 根据名字查询书籍
@Query("SELECT * FROM BookInfo WHERE name = :name ORDER BY id DESC limit 1")
BookInfo queryByName(String name);
}
数据库
database / BookDatabase.java
package com.example.datastorage.database;
import androidx.room.Database;
import androidx.room.RoomDatabase;
import com.example.datastorage.dao.BookDao;
import com.example.datastorage.enity.BookInfo;
//entities表示该数据库有哪些表,version表示数据库的版本号
//exportSchema表示是否导出数据库信息的json串,建议设为false,若设为true还需指定json文件的保存路径
@Database(entities = {BookInfo.class}, version = 1, exportSchema = true)
public abstract class BookDatabase extends RoomDatabase {
// 获取该数据库中某张表的持久化对象
public abstract BookDao bookDao();
}
实体类-书库信息
enity / Bookinfo.java
package com.example.datastorage.enity;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
//实体类
@Entity
public class BookInfo {
@PrimaryKey(autoGenerate = true)
private int id;
private String name; // 书籍名称
private String author; // 作者
private String press; // 出版社
private double price; // 价格
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 String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "BookInfo{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", press='" + press + '\'' +
", price=" + price +
'}';
}
}
工具类
util / ToastUtil.java
package com.example.datastorage.util;
import android.content.Context;
import android.widget.Toast;
public class ToastUtil {
public static void show(Context ctx, String desc) {
Toast.makeText(ctx, desc, Toast.LENGTH_SHORT).show();
}
}
主程序
RoomWriteActivity.java
package com.example.datastorage;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.example.datastorage.dao.BookDao;
import com.example.datastorage.enity.BookInfo;
import com.example.datastorage.util.ToastUtil;
import java.util.List;
public class RoomWriteActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_name;
private EditText et_author;
private EditText et_press;
private EditText et_price;
private BookDao bookDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_room_write);
et_name = findViewById(R.id.et_name);
et_author = findViewById(R.id.et_author);
et_press = findViewById(R.id.et_press);
et_price = findViewById(R.id.et_price);
findViewById(R.id.btn_save).setOnClickListener(this);
findViewById(R.id.btn_delete).setOnClickListener(this);
findViewById(R.id.btn_update).setOnClickListener(this);
findViewById(R.id.btn_query).setOnClickListener(this);
// 从App实例中获取唯一的书籍持久化对象
bookDao = MyApplication.getInstance().getBookDB().bookDao();
}
@Override
public void onClick(View v) {
String name = et_name.getText().toString();
String author = et_author.getText().toString();
String press = et_press.getText().toString();
String price = et_price.getText().toString();
switch (v.getId()) {
case R.id.btn_save:
// 以下声明一个书籍信息对象,并填写它的各字段值
BookInfo b1 = new BookInfo();
b1.setName(name);
b1.setAuthor(author);
b1.setPress(press);
b1.setPrice(Double.parseDouble(price));
bookDao.insert(b1);
ToastUtil.show(this, "保存成功");
break;
case R.id.btn_delete:
BookInfo b2 = new BookInfo();
b2.setId(1);
bookDao.delete(b2);
break;
case R.id.btn_update:
BookInfo b3 = new BookInfo();
// 根据名字查询到数据库中已有的记录
BookInfo b4 = bookDao.queryByName(name);
b3.setId(b4.getId());
b3.setName(name);
b3.setAuthor(author);
b3.setPress(press);
b3.setPrice(Double.parseDouble(price));
bookDao.update(b3);
break;
case R.id.btn_query:
List<BookInfo> list = bookDao.queryAll();
for (BookInfo b : list) {
Log.d("ning", b.toString());
}
break;
}
}
}
布局文件
activity_room_wtite.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text=" 书名:"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/edittext_select"
android:hint="请输入书籍名称"
android:inputType="text"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_author"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text=" 作者:"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_author"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/edittext_select"
android:hint="请输入作者姓名"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_press"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="出版社:"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_press"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/edittext_select"
android:hint="请输入出版社名称"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text=" 价格:"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_price"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"
android:layout_weight="1"
android:background="@drawable/edittext_select"
android:hint="请输入书籍价格"
android:inputType="numberDecimal"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
<Button
android:id="@+id/btn_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"
android:textColor="@color/black"
android:textSize="17sp" />
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除"
android:textColor="@color/black"
android:textSize="17sp" />
<Button
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="修改"
android:textColor="@color/black"
android:textSize="17sp" />
<Button
android:id="@+id/btn_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>