Jetpack-Room

news2025/1/14 2:48:39

Room是Android Jetpack中的一个组件,它提供了一个抽象层,帮助开发者在本地数据库(如SQLite)上进行持久化数据存储。Room通过简化数据库操作,使得数据管理变得更加容易和高效。

Room重要的概念

  • 实体(Entity):实体是用于表示数据库表的类。通过使用@Entity注解,可以定义一个实体类,并将其映射到数据库表。实体类中的属性对应于数据库表中的列。
  • 数据库(Database):数据库类是一个抽象类,用于定义数据库版本和包含的实体。通过使用@Database注解,可以创建一个继承自RoomDatabase的抽象类,并指定实体类和数据库版本。
  • 数据访问对象(DAO):DAO接口用于定义对数据库的访问操作。通过使用@Dao注解,可以定义一个接口,并在其中声明各种CRUD方法。这些方法会被转换为对应的SQL语句。
    在这里插入图片描述

在Android开发中,使用DAO(Data Access Object)、Repository和ViewModel的架构模式是为了实现数据与界面的清晰分离,提高应用的可维护性和扩展性。

  • DAO(Data Access Object):DAO是负责直接与数据库交互的组件。它定义了操作数据库的方法,如查询、插入、更新和删除。通过使用DAO,开发者可以将数据库操作逻辑从业务逻辑中分离出来,使得代码更加模块化和易于管理。
  • Repository:Repository层作为数据源和ViewModel之间的中介,负责处理数据请求和响应。它可以封装多个数据源,例如本地数据库和远程API,并提供一个统一的接口供ViewModel调用。这样,当数据源发生变化时,只需要修改Repository层,而不必触及ViewModel或View层,从而提高了代码的复用性和可维护性。
  • ViewModel:ViewModel是一个用于存储和管理UI相关数据的架构组件。它的主要目的是将UI控制器(如Activity和Fragment)与数据相关的业务逻辑分开,使得UI控制器能够专注于展示数据和响应用户交互,而数据的获取和处理则交由ViewModel来管理。这种分离能够使代码更加清晰、易于测试和维护。

案例:Room + ViewModel + LiveData 实现操作

使用步骤:
1.引入依赖

    def room_version = "2.6.1"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

2.定义实体

@Entity(tableName = "student")
public class Student {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id",typeAffinity = ColumnInfo.INTEGER)
    public int id;


    @ColumnInfo(name = "name",typeAffinity = ColumnInfo.TEXT)
    public String name;


    @ColumnInfo(name = "age",typeAffinity = ColumnInfo.INTEGER)
    public int age;

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

    @Ignore
    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Ignore
    public Student(int id) {
        this.id = id;
    }
}

3.定义Dao

@Dao
public interface StudentDao {

    @Insert
    void insert(Student... students);

    @Delete
    void delete(Student... students);

    @Update
    void update(Student... students);

    @Query("select * from student")
    List<Student> getAllStudent();
    
    @Query("select * from student where id = :id")
    Student getStudentById(int id);
}

3.定义MyDatabase

@Database(entities = {Student.class}, version = 1,exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {


    private static final String DB_NAME = "my_db.db";

    private static  MyDatabase mInstance;

    public static synchronized MyDatabase getInstance(Context context){
        if(mInstance == null){
            mInstance = Room.databaseBuilder(context.getApplicationContext(),
                    MyDatabase.class,
                    DB_NAME
                    ).build();
        }
        return mInstance;
    }

    public abstract StudentDao studentDao();
}

4.定义StudentRepository

public class StudentRepository {

    private StudentDao studentDao;

    public StudentRepository(Context context){
        MyDatabase db = MyDatabase.getInstance(context);
        studentDao = db.studentDao();
    }

    public void insert(Student... students){
        new InsertStudentTask(studentDao).execute(students);
    }


    class InsertStudentTask extends AsyncTask<Student, Void,Void>{

        private StudentDao studentDao;

        public InsertStudentTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }
        @Override
        protected Void doInBackground(Student... students) {
            studentDao.insert(students);
            return null;
        }
    }


    public void update(Student... students){
        new UpdateStudentTask(studentDao).execute(students);
    }

    class UpdateStudentTask extends AsyncTask<Student, Void,Void>{

        private StudentDao studentDao;

        public UpdateStudentTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }
        @Override
        protected Void doInBackground(Student... students) {
            studentDao.update(students);
            return null;
        }
    }

    public void delete(Student... students){
        new DeleteStudentTask(studentDao).execute(students);
    }

    class DeleteStudentTask extends AsyncTask<Student, Void,Void>{

        private StudentDao studentDao;

        public DeleteStudentTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }
        @Override
        protected Void doInBackground(Student... students) {
            studentDao.delete(students);
            return null;
        }
    }

    public void deleteAllStudent(){
        new DeleteAllStudentTask(studentDao).execute();
    }

    class DeleteAllStudentTask extends AsyncTask<Void, Void,Void>{

        private StudentDao studentDao;

        public DeleteAllStudentTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }
        @Override
        protected Void doInBackground(Void... voids) {
            studentDao.deleteAll();
            return null;
        }
    }


    public LiveData<List<Student>> getAllStudent(){
        return studentDao.getAllStudent();
    }

}

5.定义StudentViewModel

public class StudentViewModel extends AndroidViewModel {


    private StudentRepository studentRepository;

    public StudentViewModel(@NonNull Application application) {
        super(application);
        studentRepository = new StudentRepository(application);
    }


    public void insert(Student... students)
    {
        studentRepository.insert(students);
    }

    public void delete(Student... students)
    {
        studentRepository.delete(students);
    }

    public void deleteAllStudent(){
        studentRepository.deleteAllStudent();
    }

    public void update(Student... students)
    {
        studentRepository.update(students);
    }

    public LiveData<List<Student>> getAllStudnet(){
        return studentRepository.getAllStudent();
    }


}

6.在MainActivity操作实现数据新增删除等操作

public class MainActivity extends AppCompatActivity {

    private StudentRecyclerViewAdapter adapter;

    private StudentViewModel studentViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        List<Student> studentList = new ArrayList<>();
        adapter = new StudentRecyclerViewAdapter(studentList);
        recyclerView.setAdapter(adapter);

        studentViewModel = new ViewModelProvider(this,new ViewModelProvider.AndroidViewModelFactory())
                .get(StudentViewModel.class);
        studentViewModel.getAllStudnet().observe(this, new Observer<List<Student>>() {
            @Override
            public void onChanged(List<Student> students) {
                adapter.setStudentList(students);
                adapter.notifyDataSetChanged();
            }
        });
    }

    public void mInsert(View view) {
       Student s1 = new Student(18,"张三");
       Student s2 = new Student(19,"李四");
       studentViewModel.insert(s2);
       studentViewModel.insert(s1);
    }

    public void mUpdate(View view) {
       Student s1 = new Student(4,99,"新张三");

       studentViewModel.update(s1);
    }


    public void mDelete(View view) {
       Student s1 = new Student(2);
       studentViewModel.delete(s1);
    }

    public void mClear(View view) {
        studentViewModel.deleteAllStudent();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Facebook上的隐私保护:如何加强个人数据的安全性?

在数字化时代&#xff0c;个人数据的保护已成为用户日益关注的话题&#xff0c;尤其是在社交媒体平台如Facebook上。用户在享受社交媒体带来的便利时&#xff0c;如何有效保护个人隐私&#xff0c;维护自身的数据安全&#xff0c;成为了一个亟需解决的问题。 Facebook的隐私保护…

具备技术二:正则表达式

一、C正则库 regex 用于报文的解析。 使用接口&#xff1a;bool regex_match(const string &src, smatch &matches, regex &e); src&#xff1a;要解释的字符串。 smatch&#xff1a;一个类似于数组的结构&#xff0c;用于存储一个个解释之后的字符串。 matche…

若依-医疗系统

项目介绍 湘雅三医院医疗系统是根据长沙市湘雅第三医院来开发的一款后台管理系统&#xff0c;是基于SpringBoot和Vue2开发的一款前端后端分离项目&#xff0c; 项目中包括&#xff1a;1&#xff1a;权限认证&#xff0c;动态菜单2&#xff1a;用户管理&#xff0c;部门管理&am…

2024年诺贝尔物理学奖:机器学习与神经网络的历史性突破

2024年诺贝尔物理学奖的揭晓引发了广泛的讨论&#xff0c;因为这次的获奖者并非传统意义上的物理学家&#xff0c;而是来自机器学习与神经网络领域的研究者——John J. Hopfield 和 Geoffrey E. Hinton。这一决定不仅让人惊讶&#xff0c;也让我们重新思考物理学的边界和诺贝尔…

Microsoft 的指南可帮助缓解 Kerberoasting

随着网络威胁不断演变&#xff0c;安全专业人员必须了解最新的攻击媒介和防御机制。 Kerberoasting是一种众所周知的 Active Directory (AD) 攻击媒介&#xff0c;由于使用 GPU 加速密码破解技术&#xff0c;其有效性正在不断提高。 由于 Kerberoasting 可让网络威胁者窃取凭…

模拟电路设计期末速成总结

模拟电路设计期末速成总结 模拟电路设计是电子工程和电气工程专业中的一门重要基础课&#xff0c;主要研究连续时间信号&#xff08;模拟信号&#xff09;的处理和应用。期末复习时&#xff0c;针对这门课可以分为以下几个关键内容进行速成总结。 一、基本概念与元件 模拟信号…

Python酷库之旅-第三方库Pandas(150)

目录 一、用法精讲 681、pandas.Timestamp.now方法 681-1、语法 681-2、参数 681-3、功能 681-4、返回值 681-5、说明 681-6、用法 681-6-1、数据准备 681-6-2、代码示例 681-6-3、结果输出 682、pandas.Timestamp.replace方法 682-1、语法 682-2、参数 682-3、…

Nest.js 实战 (十四):如何获取客户端真实 IP

问题解析 在 Nest.js 应用中&#xff0c;当你试图通过 request.ip 获取客户端的 IP 地址时&#xff0c;如果总是返回 ::1 或者 ::ffff:127.0.0.1&#xff0c;这通常意味着请求来自本地主机。 因为在前后端分离应用中&#xff0c;前端请求后端服务一般的做法都是通过代理&…

查看记录Linux当前系统环境下已经安装好的CUDA和cuDNN版本信息

在实际工作中&#xff0c;经常需要接触服务器&#xff0c;有时候在实施部署的时候需要对裸机进行安装和部署&#xff0c;涉及到深度学习环境搭建的话就会比较耗时一些&#xff0c;为了简化操作工作以及保证与开发好的模型完美兼容最好的办法就是与我们自己的开发机器保持完全相…

Unity 2D角色的跳跃与二段跳示例

如图&#xff0c;实现这样的效果 其实非常简单&#xff0c;就两个必要条件 触发&#xff1a;一定是按下触发 跳跃次数&#xff1a;一定大于0 声明跳跃次数 public int jumpCount;//多段跳次数 还有一个可以优化的点&#xff0c;就是如果你想角色的多段跳可以有第一次跳的那么…

C语言复习概要(六)

公主请阅 1. 深入理解数组与指针在C语言中的应用1.1 数组名的理解 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序的实现5. 二级指针6. 指针数组7. 指针数组模拟二维数组8.总结 1. 深入理解数组与指针在C语言中的应用 数组与指针是C语言的核心概念之一&#xff0c;理解…

无极低码课程【mysql windows下安装要点】

在Windows环境中安装MySQL 5.7教程 MySQL 是世界上最流行的开源关系型数据库管理系统之一。本教程将指导您在Windows操作系统上安装MySQL 5.7。 网上教程较多&#xff0c;这里不再详述&#xff0c;注意关键点即可 准备工作 下载MySQL 5.7安装包 访问 MySQL官方网站 下载MyS…

新年好——Dijkstra+Permutation

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int, int> PII; const int N 5e410, M 2e510; const int inf 0x3f3f3f3f; int n, m; int a[6]; int h[N], e[M], ne[M], idx, w[M]; int dist[6][N];…

用Python实现运筹学——Day 17: 0-1 整数规划

一、学习内容 1. 0-1 整数规划的定义 0-1 整数规划是一类特殊的整数规划问题&#xff0c;决策变量只能取 0 或 1。它常用于解决选择问题&#xff0c;如是否选择某个项目、是否执行某个任务等。决策变量 ​ 通常表示“选择”&#xff08;&#xff09;或“不选择”&#xff08;…

实用宝典:元器件外贸独立站电子元件数据库设置完全手册

对于投身于元器件外贸领域的企业来说&#xff0c;如何建立一个既能凸显自身特色又具备高度功能性与良好用户体验的独立站&#xff1f;而在这一过程中&#xff0c;#电子元件数据库#作为独立站的核心要素之一&#xff0c;它的构建质量和管理方式又将如何直接影响网站的整体竞争力…

Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)

引言 想象一下&#xff0c;只要描述你想要的画面&#xff0c;电脑就能帮你画出来。这在几年前还像是科幻小说里的场景&#xff0c;但随着神经网络和潜在扩散模型&#xff08;LDM&#xff09;技术的发展&#xff0c;现在已经成为可能。OpenAI 推出的 DALLE 工具&#xff0c;因其…

STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计

简介 项目开发过程中&#xff0c;采用STM32L151 芯片进行涉及&#xff0c;其中需要使用其片上ADC进行多路ADC数据采样。这里就记录一下实际这块的开发过程&#xff0c;其中涉及工程代码再项目中实际投产使用。STM32L151 多通道ADC DMA循环扫描STM32CubeIDE STM32CubeMX参考设计…

【文心智能体 | AI大师工坊】通过知识库优化智能体『万圣节之纸人还魂』:探索恐怖剧本杀的奇幻之旅

文章目录 1.1、智能体运行效果1.2、创作灵感来源1.3、如何制作智能体1.4、可能会遇到的几个问题1.5、快速调优指南 My_优质智能体『万圣节之纸人还魂&#x1f47b;』&#xff1a;https://aq58pt.smartapps.baidu.com/?_swebfr1&_swebScene3611000100000000 在当今人工智能…

Vue开发中由错误These relative modules were not found 引起的问题思考及解决

一、由Vue: These relative modules were not found 引起的问题 1、vue2.6.14 These relative modules were not found 在使用vue2.6.14开发的项目在本地windows 10上都一直成功&#xff0c;想放到jenkins上进行发布。之前其它的 vue 项目也都能发布正常&#xff0c;但此次一…

【stm32】DMA的介绍与使用

DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA&#xff08;存储器到存储器的数据转运&#xff09;程序编写&#xff1a; 8、ADC连续扫描模式DMA循环转运DMA配置&#xff1a;程序编写&#xff1a; 1、DMA简介 DM…