Android开发 Room数据库框架

本文介绍了如何在Android项目中使用Room框架进行SQLite数据库操作,包括Entity映射、DAO定义、DataBase创建以及实际代码示例。涵盖了增删改查的基本操作和表的CRUD操作演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Room框架
Room数据库是基于SQLite数据库的一种框架,由谷歌推出,
主要有三个部分组成:

  1. Entity(一个Entity对应数据库中的一张表。Entity类是Sqlite表结构对Java类的映射,在Java中可以看作一个Model类。)
  2. Dao(数据访问对象(Data Access Objects),我们通过它来访问数据。)
  3. 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的注解解释器

本次有以下文件构成:

  1. Mainactivity.java(activity构造文件)
  2. Table.java(Enity)
  3. Table_dao.java(Dao)
  4. TableDataBase.java(DataBase)
  5. DBEngine.java(方便用户调用Dao)
  6. 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值