首页 > 其他分享 >Room组件的用法

Room组件的用法

时间:2023-08-11 17:11:50浏览次数:28  
标签:Room void 数据库 id 用法 Student 组件 btn public

一.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<List<Student>> 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<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方法就会回调,然后在这个方法中对页面进行更新即可。

 

标签:Room,void,数据库,id,用法,Student,组件,btn,public
From: https://www.cnblogs.com/luqman/p/Room.html

相关文章

  • Android应用程序组件Content Provider应用实例
     上文简要介绍了Android应用程序组件ContentProvider在应用程序间共享数据的原理,但是没有进一步研究它的实现。本文将实现两个应用程序,其中一个以ContentProvider的形式来提供数据访问入口,另一个通过这个ContentProvider来访问这些数据。本文的例子不仅可以为下文分析ContentP......
  • 递归的用法
    递归主要有两难:1.判断递归方法的执行主体,具体从入参来看: 例如第一个递归方法入参是文件夹,确保了是可以保存文件。那么执行的时候就不需要判断入参是否是文件夹;第二个递归方法的入参是文件,不能确定是否是文件夹,需要第一步进行判断。但是两种方法都实现了查找文件夹下的文件的......
  • max-element的min-element的基本用法
    转载自https://blog.csdn.net/qq_37978559/article/details/109782755?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169173063816800197041324%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169173063816800197041324&biz......
  • 【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(高级
    推荐超值课程:点击获取对于Httpclient请求机制进行设置操作处理。@Body注解申明一个请求体模板,模板中可以带有参数,与方法中@Param注解申明的参数相匹配,使用方法如下:interfaceLoginClient{voidlogin(Stringuser,Stringpassword);}...client.login("denominato......
  • BootstrapBlazor组件库,组件方法的表达式传参
    BootstrapBlazor组件库,组件方法的表达式传参有时候我们在循环中创建组件的时候,可能想把item的值也一并传入组件的方法事件中去处理,有很多小伙伴就不知道如何去调用事件了。下面是一段实例代码,通过循环遍历来创建图片,并且创建一个删除图片的按钮,这个按钮的OnConfirm方法需要把图......
  • 探索 OSGi 框架的组件运行机制
    OSGi框架为基于Java的组件开发提供了一套通用的和标准的解决方案,通过OSGi框架可以轻松实现组件信息的隐藏和共享。本文介绍了OSGi框架中的组件(Bundle)的运行机制,并结合实际示例加以说明,读者可以进一步深入了解OSGi框架的基本原理,并解决实际开发工作中遇到的类似问题。在目......
  • WEB自动化-Allure报告-Allure安装和简单用法
    WEB自动化测试可以借助Allure生成美观的测试报告。1、安装工具及配置环境变量1.安装JDK1.8才可运行allure,直接百度,一大堆2.下载Allure的安装包(版本号:2.13.5)https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/3.解压Allure压缩包......
  • SQL JOIN的用法,你会了吗?
    SQLJOIN是在关系型数据库中常用的操作,用于将两个或多个表中的数据合并起来,以满足查询需求。本文将介绍SQLJOIN的基本概念、不同类型的JOIN,以及使用示例。SQLJOIN的概念在关系型数据库中,数据通常分布在多个表中,并且这些表之间存在关联。SQLJOIN允许我们基于关联条件将这些......
  • avue组件自定义按钮/标题/内容/搜索栏
    话不多说笔记直接分享!!一、自定义crud搜索栏组件<templateslot-scope="scope"slot="provinceCodeSearch"> <avue-select v-model="objFrom.provinceCode"//这是存放省份的code placeholder="请选择省市" :di......
  • 【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙
    推荐超值课程:点击获取前提介绍如果要设计开发一套微服务基础架构,参数化配置是一个非常重要的点,而Netflix也开源了一个叫变色龙Archaius的配置中心客户端,而且Archaius可以说是比其他客户端具备更多生产级特性,也更灵活。*在NetflixOSS微服务技术栈中,几乎所有的其它组件(例如Zuul......