美文网首页
Room database

Room database

作者: 奔跑吧小马哥 | 来源:发表于2021-06-07 13:10 被阅读0次

1,三角色
(1)表:定义一个类,加上注解@Entity,类里需要定义主键,使用@PrimaryKey标识,如果主键自动产生增长,需要加上(autoGenerate = true),其他变量根据自身业务定义,下面例子定义了一个Student表类:

package com.mike.androidtips.database.room;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

//表
@Entity
public class Student {
    @PrimaryKey (autoGenerate = true)
    private int id;

    int age;
    String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public Student() {

    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

(2)DAO: Database Access Object, 数据库访问对象类,作用是对数据库中的表进行增删改查操作。在类上加@Dao注解。其他是操作类注解:@Insert, @Update, @Delete, @Query,@Query需要加SQL语句,具体看StudentDao类:

@Dao
public interface StudentDao {
    //增
    @Insert
    public void addStudents(Student...students);

    // 删
    @Delete
    public void deleteStudents(Student...students);

    // 删 全部
    @Query("DELETE FROM Student")
    public void deleteAllStudents();

    //改
    @Update
    public void updateStudents(Student...students);

    // 查
    @Query("SELECT * FROM Student ORDER BY ID DESC")
    public List<Student> getAllStudents();
}

(3) 数据库类:和前面定义的表以及Dao关联起来
- 数据库定义成抽象类
- 数据库类需添加注解@Database,里面定义版本号,以及通过entries关联表
- 需要定义成单例模式
- 定义抽象方法,获取Dao,

@Database(entities = {Student.class}, version = 1, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {

    private static StudentDatabase INSTANCE;
    public static synchronized StudentDatabase getInstance(Context context) {

        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), StudentDatabase.class,
                    "student database")
                    //数据库默认是异步线程
                    //.allowMainThreadQueries() //强制开启主线程也可以用数据库 ,真实环境不要用
                    .build();
        }
        return INSTANCE;
    }

    public abstract StudentDao getStudentDao();

    @NonNull
    @Override
    protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration config) {
        return null;
    }

    @NonNull
    @Override
    protected InvalidationTracker createInvalidationTracker() {
        return null;
    }

    @Override
    public void clearAllTables() {

    }
}

  1. 数据库的使用,封装一个DBEngine,对外(User)提供增删改查的API。
  • DBEngine在构造中获取Dao
  • 封装多个AsyncTask操作数据库,把Dao传值进去
  • API里调用AsyncTask的execute方法
public class DBEngine {
    private StudentDao studentDao;
    private String TAG = "DBEngine";
    public DBEngine(Context context) {
        StudentDatabase database = StudentDatabase.getInstance(context);
        studentDao = database.getStudentDao();
    }

    //插入
    public void addStudents(Student...students) {
        new AddAsyncTask(studentDao).execute(students);
    }

    //更新
    public void updateStudents(Student...students) {
        new UpdateAsyncTask(studentDao).execute(students);
    }

    //删除单个
    public void deleteStudents(Student...students) {
        Log.d(TAG, "enter deleteStudents");

        new DeleteAsyncTask(studentDao).execute(students);
    }

    //删除所有
    public void deleteAllStudents(){

        new DeleteAllAsyncTask(studentDao).execute();
    }

    //
    public void queryAllStudents() {
        Log.d("DBEngine", "enter queryAllStudents");
        new QueryAsyncTask(studentDao).execute();
    }

    //插入task
    static class AddAsyncTask extends AsyncTask<Student, Void, Void> {

        private StudentDao studentDao;
        public AddAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            studentDao.addStudents(students);
            return null;
        }
    }

    //更新task
    static class UpdateAsyncTask extends AsyncTask<Student, Void, Void> {

        private StudentDao studentDao;
        public UpdateAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            studentDao.updateStudents(students);
            return null;
        }
    }

    //删除
    static class DeleteAsyncTask extends AsyncTask<Student, Void, Void> {

        private StudentDao studentDao;
        public DeleteAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
            Log.d("DBEngine", "enter DeleteAsyncTask");
        }

        @Override
        protected Void doInBackground(Student... students) {
            studentDao.deleteStudents(students);
            Log.d("DBEngine", "enter DeleteAsyncTask, doInBackground");

            return null;
        }
    }

    //删除全部
    static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {

        private StudentDao studentDao;
        public DeleteAllAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            studentDao.deleteAllStudents();
            return null;
        }
    }

    static class QueryAsyncTask extends AsyncTask<Void, Void, Void> {

        private StudentDao studentDao;
        public QueryAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Log.d("DBEngine" , "QueryAsyncTask doInBackground");
            List<Student> allStudents = studentDao.getAllStudents();
            Log.d("DBEngine" , "QueryAsyncTask doInBackground, size = " + allStudents.size());

            for (Student allStudent : allStudents) {
                Log.d("DBEngine" , "全部查询每一项: " + allStudent.toString());

            }
            return null;
        }
    }
}

3, User使用DBEngine

public class RoomDatabaseActivity extends Activity {

    private String TAG = RoomDatabaseActivity.class.getSimpleName();
    private DBEngine dbEngine;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_roomdatabase_layout);
        dbEngine = new DBEngine(this);
    }

    public void insertAction(View view) {
        Student student1 = new Student(20, "张三");
        Student student2 = new Student(30, "李四");
        Student student3 = new Student(15, "王五");
        Log.d(TAG, "insertAction...");
        dbEngine.addStudents(student1, student2, student3);
    }

    public void updateAction(View view) {
        Student student = new Student(28, "王二麻子");
        student.setId(3);
        dbEngine.updateStudents(student);
    }

    public void deleteAction(View view) {
        Log.d(TAG, "enter deleteAction");
        Student student = new Student();
        student.setId(3);
        dbEngine.deleteStudents(student);
    }

    public void queryAction(View view) {
        dbEngine.queryAllStudents();
    }

    public void deleteAll(View view) {
        dbEngine.deleteAllStudents();
    }
}

相关文章

  • Room database

    1,三角色(1)表:定义一个类,加上注解@Entity,类里需要定义主键,使用@PrimaryKey标识,如果主键...

  • Room

    Save data in a local database using Room Room 提供了一个Sqlite...

  • Android Jetpack架构组件-Room基本使用

    一、简介 Room有三个主要的组件:Database、Dao、Entity 数据库(Database):你可以使用...

  • Room Database入门指南

    说到Android端有哪些可以使用的数据库,大家首先想到的自然是SQLite这种带有官方属性加持的轻型的数据库。 ...

  • Database with Room using Rxjava

    Google发布了新的开源库Room,他是属于数据库层的,可以让我们顺畅的数据库,更多相关信息可以移步官方文档。在...

  • 【白水日记】Room database

    Room是Jetpack中的一个组件,处理和配置数据库的琐事,内部实现还是SQLite 数据通常使用数据类表示...

  • Android Room使用

    介绍 Room是Google提供的一个ORM库。Room提供了三个主要的组件: @Database:@Databa...

  • Room数据库的理解

    Room主要包含三个组件: 1. 数据库(Database) 数据库名,使用@Database注解的类应满足以下条...

  • AndroidX Room管理数据库 App50

    简易实现Room管理Sqlite数据库 数据库要放那种数据 实体行Entity 和列 Dao层 Database抽...

  • Jetpack 之 Room Database 简介及其使用

    简介 Room是SQLite之上的一个抽象层,通过Room,可以更加丝滑的使用SQLite的全部功能。并且,原本在...

网友评论

      本文标题:Room database

      本文链接:https://www.haomeiwen.com/subject/oedleltx.html