美文网首页
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

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