• Room组件的用法


    一.Android官方ORM数据库Room

      Android采用Sqlite作为数据库存储。但由于Sqlite代码写起来繁琐且容易出错,因此Google推出了Room,其实Room就是在Sqlite上面再封装了一层。下面是Room的架构图:

          

      要想更好地理解上面的图,我们先要理解几个概念:Entity和Dao

      Entity:实体,一个entity就对应于数据库中的一张表。Entity类是Sqlite中的表对java类的映射,例如有一个学生表,有id,name,age三个字段;那么对应的就有一个学生类,有id,name,age三个成员变量和学生表中的字段进行一一对应。

      Dao:即Data Access Object,数据访问对象,就是字面意思,可以通过他来访问数据库中的数据。

      那么所谓的ORM(Object Relational Mapping),对象关系映射,就很好理解了。就是建立一个从数据库表到java类的映射,表中的字段对应类中的成员变量,表中的记录对应该类的一个实例。

    二.Room数据库的基本使用方法

      1.在使用Room数据库前,先要在app/build.gradle文件中导入以下的依赖:

      implementation 'androidx.room:room-runtime:2.5.2'
      annotationProcessor 'androidx.room:room-compiler:2.5.2'
     2.创建一个关于学生的Entity,即创建一张学生表:
    复制代码
    
    
    @Entity
    public class Student {
    @PrimaryKey
    private Integer id;
    @ColumnInfo(name="name",typeAffinity = ColumnInfo.TEXT)
    private String name;
    @ColumnInfo(name="age",typeAffinity = ColumnInfo.INTEGER)
    private Integer age;

    public Integer getId() {
    return id;
    }

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

    public String getName() {
    return name;
    }

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

    public Integer getAge() {
    return age;
    }

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

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

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

      @Entity注解用于将Student类和Room数据库中的数据表对应起来;@PrimaryKey注解即主键约束;@ColumnInfo注解可以设置该成员变量对应的表中字段的名称以及类型

      需要注意的一点是get方法不可省略

      3.针对上面的学生类Entity,我们需要定义一个Dao接口文件,以便对数据库进行访问,在接口的上方加上@Dao注解即可

    复制代码
    @Dao
    public interface StudentDao {
        @Insert
        void insertStudent(Student student);
        @Delete
        void deleteStudent(Student student);
        @Update
        void updataStudent(Student student);
        @Query("select * from Student")
        LiveData> getAllStudents();
        @Query("select * from student where id=:id")
        Student selectStudentById(Integer id);
    }
    复制代码

      4.定义好Entity和Dao后,接下来就是创建数据库了,代码如下:

    复制代码
    @Database(entities = {Student.class},version = 1)
    public abstract class MyDatabase extends RoomDatabase {
        private static final String DATABASE_NAME="my_db";
        private static MyDatabase myDatabase;
        public static synchronized MyDatabase getInstance(Context context){
            if(myDatabase==null){
                myDatabase= Room.databaseBuilder(context,MyDatabase.class,DATABASE_NAME).build();
            }
            return myDatabase;
        }
        @Override
        public void clearAllTables() {
    
        }
    
        @NonNull
        @Override
        protected InvalidationTracker createInvalidationTracker() {
            return null;
        }
    
        @NonNull
        @Override
        protected SupportSQLiteOpenHelper createOpenHelper(@NonNull DatabaseConfiguration databaseConfiguration) {
            return null;
        }
        public abstract StudentDao studentDao();
    }
    复制代码

      @Database注解用于告诉系统这是Room数据库对象,entities属性用于指定该数据库有哪些表,version用于指定数据库的版本号

      数据库类需要继承RoomDatabase类,并结合单例模式完成创建。

      到这里,数据库和表就创建完成了,接下来就看看如何对数据库进行增删改查了。

      5.结合ViewModel和LiveData,对数据库进行增删改查,并且数据库表的记录发生变化时,页面可以及时收到通知,并更新页面。

      LiveData通常和ViewModel一起使用,ViewModel用于存储页面的数据,因此我们可以把数据库的实例化放到ViewModel中,但数据库的实例化需要用到Context对象,因此我们不宜直接用ViewModel,而应该用其子类AndroidViewModel。  

    复制代码
    public class StudentViewModel extends AndroidViewModel {
        private MyDatabase myDatabase;
        private LiveData> liveDataStudents;
    
        public StudentViewModel(@NonNull Application application) {
            super(application);
            myDatabase=MyDatabase.getInstance(application);
            liveDataStudents=myDatabase.studentDao().getAllStudents();
        }
        public LiveData> getLiveDataStudents(){
            return liveDataStudents;
        }
        public void insertStudent(Student student){
            myDatabase.studentDao().insertStudent(student);
        }
        public void deleteStudent(Student student){
            myDatabase.studentDao().deleteStudent(student);
        }
        public void updateStudent(Student student){
            myDatabase.studentDao().updataStudent(student);
        }
        public Student selectStudentById(Integer id){
            return myDatabase.studentDao().selectStudentById(id);
        }
    }
    复制代码

      6.在Activity中实例化StudentViewModel,并进行增删改查操作,并监听LiveData的变化。

    复制代码
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btn_insert,btn_delete,btn_update,btn_select;
        private TextView tv_display;
        private StudentViewModel studentViewModel;
        private ExecutorService executor = Executors.newSingleThreadExecutor();
        private Student student;
        @SuppressLint("MissingInflatedId")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv_display=findViewById(R.id.tv_display);
            btn_delete=findViewById(R.id.btn_delete);
            btn_insert=findViewById(R.id.btn_insert);
            btn_update=findViewById(R.id.btn_update);
            btn_select=findViewById(R.id.btn_select);
            btn_select.setOnClickListener(this);
            btn_insert.setOnClickListener(this);
            btn_delete.setOnClickListener(this);
            btn_update.setOnClickListener(this);
            studentViewModel=new ViewModelProvider(this,new MyViewModelFactory(getApplication())).get(StudentViewModel.class);
            studentViewModel.getLiveDataStudents().observe(this, new Observer>() {
                @Override
                public void onChanged(List students) {
                    tv_display.setText(students+"");
                }
            });
        }
    
        @Override
        public void onClick(View view) {
            switch(view.getId()){
                case R.id.btn_delete:
                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            studentViewModel.deleteStudent(new Student(1,"jack",20));
                        }
                    });
                    break;
                case R.id.btn_update:
                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            studentViewModel.updateStudent(new Student(1,"zhangsan",32));
                        }
                    });
    
                    break;
                case R.id.btn_insert:
                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            studentViewModel.insertStudent(new Student(1,"lisi",22));
                        }
                    });
                    break;
                case R.id.btn_select:
                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            student = studentViewModel.selectStudentById(1);
                            Log.i("test",student.toString());
                        }
                    });
                    break;
            }
        }
    }
    复制代码
    复制代码
    public class MyViewModelFactory implements ViewModelProvider.Factory {
        private Application application;
        public MyViewModelFactory(Application application){
            this.application=application;
        }
        @NonNull
        @Override
        public extends ViewModel> T create(@NonNull Class modelClass) {
            return (T)new StudentViewModel(application);
        }
    }
    复制代码

      运行应用程序,对数据库进行增删改操作时,onChanged方法就会回调,然后在这个方法中对页面进行更新即可。

     

  • 相关阅读:
    机器学习高手之路:发现TensorFlow学习网站的无限可能!
    M1 pro 芯片Macbook Pro配置anaconda&& GPU版Pytorch
    使用自功率谱、互功率谱估计滤波器幅频特性
    springboot 点滴(1)springboot IOC
    ubuntu16 iptables命令行黑白名单设置
    从new File("")到jdk源码
    【web-攻击用户】(9.1.3)查找并利用XSS漏洞--反射型
    PyTorch nn.RNN 参数全解析
    Windows 事件转发到 SQL 数据库
    如何剪辑视频?方法来了,零基础也能学会!
  • 原文地址:https://www.cnblogs.com/luqman/p/Room.html