Room框架
Room数据库是基于SQLite数据库的一种框架,由谷歌推出,
主要有三个部分组成:
- Entity(一个Entity对应数据库中的一张表。Entity类是Sqlite表结构对Java类的映射,在Java中可以看作一个Model类。)
- Dao(数据访问对象(Data Access Objects),我们通过它来访问数据。)
- DataBase( 创建数据库实例)
在使用之前要添加它的支持包:
//要想使用room需要导入room的支持
def room_version = "2.2.0-alpha01"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" //room的注解解释器
本次有以下文件构成:
- Mainactivity.java(activity构造文件)
- Table.java(Enity)
- Table_dao.java(Dao)
- TableDataBase.java(DataBase)
- DBEngine.java(方便用户调用Dao)
- activity_main.xml(布局文件)
Mainactivity.java
package com.example.sqlite;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.example.sqlite.room.DBEngine;
import com.example.sqlite.room.Table;
//room的学习
public class MainActivity2 extends AppCompatActivity {
private DBEngine dbEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//获得db对象
dbEngine = new DBEngine(this);
}
/**
* 插入三个信息
* @param view
*/
public void insert(View view) {
Table table_0 = new Table("语文","张三","109");
Table table_1 = new Table("英语","李四","234");
Table table_2 = new Table("数学","王五","123");
dbEngine.inserTable(table_0,table_1,table_2);
}
/**
* 修改 下标为2 的信息
* @param view
*/
public void update(View view) {
Table table_0 = new Table("军事",null,"124");
table_0.setId(2);
dbEngine.updateTable(table_0);
}
/**
* 删除主键为1 的信息
* @param view
*/
public void delete(View view) {
Table table = new Table(null,null,null);
table.setId(1);
dbEngine.deleteTable(table);
}
/**
* 搜索并显示所有信息
* @param view
*/
public void queryable(View view) {
dbEngine.queryAllTable();
}
/**
* 删除数据库所有信息
* @param view
*/
public void delete_all(View view) {
dbEngine.deleteallTable();
}
/**
* 根据特定条件显示信息
* @param view
*/
public void query(View view) {
Table table = new Table(null,null,null);
//设置主键为2
table.setId(2);
dbEngine.queryTable(table);
}
}
Table.java——实际上就是一张表(Entiy)
package com.example.sqlite.room;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
/**
* 想要创建一个表
* 主键唯一 自动增长(auto)
*
*/
@Entity
public class Table {
//设置主键,自动增长
@PrimaryKey(autoGenerate = true)
private int id;
private String course_name;
private String teacher_name;
private String course_adress;
//构造方法
public Table(String course_name, String teacher_name, String course_adress) {
this.course_name = course_name;
this.teacher_name = teacher_name;
this.course_adress = course_adress;
}
public String getCourse_name() {
return course_name;
}
public void setCourse_name(String course_name) {
this.course_name = course_name;
}
public String getTeacher_name() {
return teacher_name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setTeacher_name(String teacher_name) {
this.teacher_name = teacher_name;
}
public String getCourse_adress() {
return course_adress;
}
public void setCourse_adress(String course_adress) {
this.course_adress = course_adress;
}
@Override
public String toString() {
return "Table{" +
"id=" + id +
", course_name='" + course_name + '\'' +
", teacher_name='" + teacher_name + '\'' +
", course_adress='" + course_adress + '\'' +
'}';
}
}
Table_dao.java(接口)——里面含有操作数据库的方法(sql语句)
package com.example.sqlite.room;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.RawQuery;
import androidx.room.Update;
import java.util.List;
//留给用户使用
@Dao
public interface Table_dao {
//增加
@Insert
void insertTable(Table... tables);
//改写
@Update
void updateTable(Table... tables);
//删除 单个--根据条件
@Delete
void deleteTable(Table... tables);
//删除所有信息
@Query("DELETE FROM `Table`")
void deleteallTable();
//查询 单个--根据条件
//query后面跟的是SQL语句,里面可以设有变量方便编程
@Query("SELECT * FROM `Table` WHERE id = :id")
Table getTable(int id);
//查询所有
@Query("SELECT * FROM `Table` ORDER BY ID DESC")
List<Table> getAllTable();
}
TableDataBase.java——将数据库关联到之前设定的表
package com.example.sqlite.room;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.DatabaseConfiguration;
import androidx.room.InvalidationTracker;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteOpenHelper;
//将数据库 关联 之前的表 数据库信息
@Database(entities = {Table.class},version = 1,exportSchema = false)
public abstract class TableDatebase extends RoomDatabase {
//用户只需要操作dao,我们必须暴露dao
public abstract Table_dao getTable_dao();
//单例模式 返回DB
private static TableDatebase INSTANCE;
public static synchronized TableDatebase getInstance(Context context){
if (INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),TableDatebase.class,"TABLE_DATABASE")
.build();
}
return INSTANCE;
}
}
DBEngine.java
package com.example.sqlite.room;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import java.util.List;
public class DBEngine {
private Table_dao table_dao;
public DBEngine(Context context){
TableDatebase tableDatebase = TableDatebase.getInstance(context);
table_dao = tableDatebase.getTable_dao();
}
//增删改查
//增 insert
public void inserTable(Table... tables){
new InsertAsyncTask(table_dao).execute(tables);
}
//修改 update
public void updateTable(Table... tables){
new UpdateAsyncTask(table_dao).execute(tables);
}
//删除 delete
public void deleteTable(Table... tables){
new DeleteAsyncTask(table_dao).execute(tables);
}
//删除 全部删除 deleteAll
public void deleteallTable(){
new DeleteAllTable(table_dao).execute();
}
//查询全部
public void queryAllTable(){
new QueryAllTable(table_dao).execute();
}
//查询 条件
public void queryTable(Table... tables){
new QueryTable(table_dao).execute(tables);
}
//如果我们想完数据库 默认异步操作 ================== 异步操作
//AsyncTask的异步线程的一个抽象类 具体理解可以看:https://www.jianshu.com/p/ee1342fcf5e7
public class InsertAsyncTask extends AsyncTask<Table,Void,Void>{
private Table_dao dao;
public InsertAsyncTask(Table_dao table_dao){
dao = table_dao;
}
@Override
protected Void doInBackground(Table... tables) {
dao.insertTable(tables);
return null;
}
}
//修改 update
public class UpdateAsyncTask extends AsyncTask<Table,Void,Void>{
private Table_dao dao;
public UpdateAsyncTask(Table_dao table_dao){
dao = table_dao;
}
@Override
protected Void doInBackground(Table... tables) {
dao.updateTable(tables);
return null;
}
}
//删除根据条件
public class DeleteAsyncTask extends AsyncTask<Table,Void,Void>{
private Table_dao dao;
public DeleteAsyncTask(Table_dao table_dao){
dao = table_dao;
}
//既然传入了table说明是条件删除
@Override
protected Void doInBackground(Table... tables) {
dao.deleteTable(tables);
return null;
}
}
//全部删除
public class DeleteAllTable extends AsyncTask<Void,Void,Void>{
private Table_dao dao;
public DeleteAllTable(Table_dao table_dao){
dao = table_dao;
}
//全部删除
@Override
protected Void doInBackground(Void... voids) {
dao.deleteallTable();
return null;
}
}
//全部查询
public static class QueryAllTable extends AsyncTask<Void,Void,Void>{
private Table_dao dao;
public QueryAllTable(Table_dao table_dao){
dao = table_dao;
}
//全部查询
@Override
protected Void doInBackground(Void... voids) {
List<Table> allTable = dao.getAllTable();
//遍历所有结果
for (Table table : allTable){
Log.e("leo", "doInBackground:全部查询 每一项 查询 " +table.toString());
}
return null;
}
}
//条件查询
public static class QueryTable extends AsyncTask<Table,Void,Void>{
private Table_dao dao;
public QueryTable(Table_dao table_dao){
dao = table_dao;
}
//条件查询
@Override
protected Void doInBackground(Table... tables) {
try {
//可以通过下面这种方式获得主键,从而查询到相应的信息
Table table = dao.getTable(tables[0].getId());
//显示结果
Log.e("leo", "doInBackground:全部查询 每一项 查询 " +table.toString());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入"
android:onClick="insert"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改"
android:onClick="update"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除"
android:onClick="delete"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全部删除"
android:onClick="delete_all"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全部查询"
android:onClick="queryable"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="条件查询"
android:onClick="query"/>
</LinearLayout>