• Android开发使用Room(SQLite封装)操作数据库


    一、Room介绍

               Android采用Sqlite作为数据库存储。Sqlite代码写起来繁琐且容易出错,所以开源社区里逐渐出现了各种ORM(Object Relational Mapping)库。这些开源ORM库都是为了方便Sqlite的使用,包括数据库的创建,升级,增删改查等。常见的ORM有ORMLite,GreenDAO等。Google也意识到了推出自家ORM的必要性,于是有了Room。
               Room和其它ORM库一样,也是在Sqlite上提供了一层抽象。
    在介绍Room的使用之前,我们需要先明白几个概念。
    Entity:这是一个Model类,对应于数据库中的一张表。Entity类是Sqlite表结构在Java类的映射。
    Dao:(Data Access Objects)数据访问对象,顾名思义,我们可以通过它来访问数据。
    总的来说就是通过注解的方式操作数据库

    二、代码实现

    1、添加依赖并同步

    在工程build.gradle中添加下面几句

        def room_version = "2.2.0-alpha01"
        implementation "androidx.room:room-runtime:$room_version"
        annotationProcessor "androidx.room:room-compiler:$room_version"
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2、新建一个类通过@Database注解生成一个数据库

    StudentDatabase.java

    package com.example.learning01;
    
    import android.content.Context;
    
    import androidx.room.Database;
    import androidx.room.Room;
    import androidx.room.RoomDatabase;
    
    @Database(entities = {Student.class},version = 1,exportSchema = false)//关联数据库
    public abstract class StudentDatabase extends RoomDatabase {
        //用户只需要操作DAO
        public abstract StudentDao get_student_dao();
        //单例模式
        private static StudentDatabase studentDatabase;
        public static synchronized StudentDatabase getInstance(Context context){
            if(studentDatabase == null){
                studentDatabase = Room.databaseBuilder(context.getApplicationContext(),StudentDatabase.class,"student_database")
                        //.allowMainThreadQueries() //主线程也能操作数据库 只能测试用
                        .build();
            }
            return studentDatabase;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3、新建一个类通过@Entity注解生成一个表

    Student.java

    package com.example.learning01;
    
    import androidx.room.Entity;
    import androidx.room.PrimaryKey;
    
    //一张表
    @Entity
    public class Student {
    
    
        @PrimaryKey(autoGenerate = true)
        private int id;
    
        private String name;
    
        private int age;
    
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        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 int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    4、新建一个类通过@Dao实现增、删、改、查

    StudentDao.java

    package com.example.learning01;
    
    import androidx.room.Dao;
    import androidx.room.Delete;
    import androidx.room.Insert;
    import androidx.room.Query;
    import androidx.room.Update;
    
    import java.util.List;
    
    @Dao
    public interface StudentDao {
        //增
        @Insert
        void insert_student(Student ... students);
    
        //改
        @Update
        void update_student(Student ... students);
    
        //删
        @Delete
        void delete_student(Student ... students);
    
        //删
        @Query("DELETE FROM Student")
        void delete_all_student();
    
        //查
        @Query("SELECT * FROM Student ORDER BY id DESC")
        List<Student> get_all_student();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    5、新建一个类通过实现数据库操作,通过异步方式

    DBEngine.java

    package com.example.learning01;
    
    import android.content.Context;
    import android.os.AsyncTask;
    import android.util.Log;
    
    import java.util.List;
    
    public class DBEngine {
        private static final String TAG = "DBEngine";
    
        private StudentDao studentDao;
    
        public DBEngine(Context context) {
    
            StudentDatabase studentDatabase = StudentDatabase.getInstance(context);
            studentDao = studentDatabase.get_student_dao();
    
        }
        //插入
        public void insert_student(Student ... student) {
            new InsertAsynTask(studentDao).execute(student);
        }
        //更新
        public void update_student(Student ... student) {
            new UpdateAsynTask(studentDao).execute(student);
        }
        //删除
        public void delete_student(Student ... student) {
            new DeleteAsynTask(studentDao).execute(student);
        }
        //全部删除
        public void delete_all_student(Student ... student) {
            new DeleteAllAsynTask(studentDao).execute();
        }
        //全部查询
        public void quary_all_student(Student ... student) {
            new QuaryAllAsynTask(studentDao).execute();
        }
    
    
        //开启异步操作
        static class InsertAsynTask extends AsyncTask<Student,Void,Void> {
            private StudentDao studentDao;
            public InsertAsynTask(StudentDao studentDao) {
                this.studentDao = studentDao;
            }
    
            @Override
            protected Void doInBackground(Student ... students) {
                studentDao.insert_student(students);
                return null;
            }
        }
        static class UpdateAsynTask extends AsyncTask<Student,Void,Void> {
            private StudentDao studentDao;
            public UpdateAsynTask(StudentDao studentDao) {
                this.studentDao = studentDao;
            }
    
            @Override
            protected Void doInBackground(Student... students) {
                this.studentDao.update_student(students);
                return null;
            }
        }
        static class DeleteAsynTask extends AsyncTask<Student,Void,Void> {
            private StudentDao studentDao;
            public DeleteAsynTask(StudentDao studentDao) {
                this.studentDao = studentDao;
            }
    
            @Override
            protected Void doInBackground(Student... students) {
                this.studentDao.delete_student(students);
                return null;
            }
        }
        //全部删除
        static class DeleteAllAsynTask extends AsyncTask<Void,Void,Void> {
            private StudentDao studentDao;
            public DeleteAllAsynTask(StudentDao studentDao) {
                this.studentDao = studentDao;
            }
            @Override
            protected Void doInBackground(Void... voids) {
                this.studentDao.delete_all_student();
                return null;
            }
        }
        static class QuaryAllAsynTask extends AsyncTask<Void,Void,Void> {
    
            private StudentDao studentDao;
            public QuaryAllAsynTask(StudentDao studentDao) {
                this.studentDao = studentDao;
            }
    
            @Override
            protected Void doInBackground(Void... voids) {
                List<Student> all_student = this.studentDao.get_all_student();
                //遍历全部查询的结果
                for (Student student:all_student)
                {
                    Log.i(TAG, "doInBackground: "+student.toString());
                }
                return null;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110

    三、操作数据库

    首先定义一个引擎

     private DBEngine dbEngine;
    
    • 1

    然后实现

    dbEngine = new DBEngine(this);
    
    • 1

    完整代码

    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG ="MainActivity";
    
        private DBEngine dbEngine;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dbEngine = new DBEngine(this);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1、增

        public void insert_db(View view) {
            Student student1 = new Student("xupeng1",10);
            Student student2 = new Student("xupeng2",20);
            Student student3 = new Student("xupeng3",30);
            Student student4 = new Student("xupeng4",40);
    
    
            dbEngine.insert_student(student1,student2,student3,student4);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、删

        public void delete_db(View view) {
            Student student = new Student(null,0);
            student.setId(3);
            dbEngine.delete_student(student);
        }
    
        public void delete_all_db(View view) {
            dbEngine.delete_all_student();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、改

        public void update_db(View view) {
    
            Student student = new Student("weipan",500);
            student.setId(3);
            dbEngine.update_student(student);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、查

        public void find_db(View view) {
            dbEngine.quary_all_student();
        }
    
    • 1
    • 2
    • 3

    四、操作数据库源码

    package com.example.learning01;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.annotation.SuppressLint;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    
    
    public class MainActivity extends AppCompatActivity {
    
        private static final String TAG ="MainActivity";
    
        private DBEngine dbEngine;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dbEngine = new DBEngine(this);
    
        }
    
        public void create_db(View view) {
        }
    
        public void find_db(View view) {
            dbEngine.quary_all_student();
        }
    
        public void insert_db(View view) {
            Student student1 = new Student("xupeng1",10);
            Student student2 = new Student("xupeng2",20);
            Student student3 = new Student("xupeng3",30);
            Student student4 = new Student("xupeng4",40);
    
    
            dbEngine.insert_student(student1,student2,student3,student4);
        }
    
        public void update_db(View view) {
    
            Student student = new Student("weipan",500);
            student.setId(3);
            dbEngine.update_student(student);
        }
    
        public void delete_db(View view) {
            Student student = new Student(null,0);
            student.setId(3);
            dbEngine.delete_student(student);
        }
    
        public void delete_all_db(View view) {
            dbEngine.delete_all_student();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
  • 相关阅读:
    IP地址查询在社交行业中的崭新应用
    google的chromedriver最新版下载地址
    微信自动化推送天气预报信息教程【Python版源代码】
    redis深度历险 1 - Redis基础数据结构-001
    Android 蓝牙 A2dp更改编码Codec格式 (一)
    10.12021 CCPC 新疆省赛ABD
    大商创的开源代码中有很多后门,以方便官方监控系统的使用,官方做的真是无孔不入啊,我找到了下面几种
    java毕业设计网上商城购物系统mybatis+源码+调试部署+系统+数据库+lw
    点云从入门到精通技术详解100篇-基于点云的刺梨果实三维建模 及其生物力学特性研究(中)
    idea中maven plugin提示not found
  • 原文地址:https://blog.csdn.net/qq_15181569/article/details/127673958