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>