详解Android中Room组件的使用

 更新时间:2023年08月11日 17:15:50   作者:故乡的樱花开了  
Room 是在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库,这篇文章主要为大家介绍了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注解即可

@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 +
                '}';
    }
}

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<List<Student>> liveDataStudents;
    public StudentViewModel(@NonNull Application application) {
        super(application);
        myDatabase=MyDatabase.getInstance(application);
        liveDataStudents=myDatabase.studentDao().getAllStudents();
    }
    public LiveData<List<Student>> 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<List<Student>>() {
            @Override
            public void onChanged(List<Student> 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 <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        return (T)new StudentViewModel(application);
    }
}

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

以上就是详解Android中Room组件的使用的详细内容,更多关于Android Room组件的资料请关注脚本之家其它相关文章!

相关文章

  • Kotlin Service实现消息推送通知过程

    Kotlin Service实现消息推送通知过程

    这几天分析了一下的启动过程,于是乎,今天写一下Service使用; 给我的感觉是它并不复杂,千万不要被一坨一坨的代码吓住了,虽然弯弯绕绕不少,重载函数一个接着一个,就向走迷宫一样,但只要抓住主线阅读,很快就能找到出口
    2022-12-12
  • Flutter进阶之实现动画效果(八)

    Flutter进阶之实现动画效果(八)

    这篇文章主要为大家详细介绍了Flutter进阶之实现动画效果的第八篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android开发实现在TextView前面加标签示例

    Android开发实现在TextView前面加标签示例

    这篇文章主要为大家介绍了Android开发实现TextView前面加标签示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Android开发中遇到端口号占用问题解决方法

    Android开发中遇到端口号占用问题解决方法

    这篇文章主要介绍了Android开发中遇到端口号占用问题解决方法,本文给出了一个简洁实用的方法来解决这个烦人的问题,需要的朋友可以参考下
    2015-06-06
  • Android ViewFlipper的详解及实例

    Android ViewFlipper的详解及实例

    这篇文章主要介绍了Android ViewFlipper的详解及实例的相关资料,通过本文希望能帮助大家理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • 解析android 流量监测的实现原理

    解析android 流量监测的实现原理

    本篇文章是对android中流量监测的实现原理进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Flutter 页面跳转和传值的实现

    Flutter 页面跳转和传值的实现

    跳转传值是再普通不过的小功能了,在开发中会经常用到,比如列表进入详情,本文主要介绍了Flutter 页面跳转和传值的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • Android从0到完整项目(1)使用Android studio 创建项目详解

    Android从0到完整项目(1)使用Android studio 创建项目详解

    本篇文章主要介绍了Android从0到完整项目(1)使用Android studio 创建项目详解,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • Android实现文字滚动播放效果的代码

    Android实现文字滚动播放效果的代码

    这篇文章主要介绍了Android实现文字滚动播放效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Android实现支付宝AR扫描动画效果

    Android实现支付宝AR扫描动画效果

    这篇文章主要为大家详细介绍了Android实现支付宝AR扫描动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论