Jetpack-Room

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;}@Ignorepublic Student(int age, String name) {this.age = age;this.name = name;}@Ignorepublic Student(int id) {this.id = id;}
}

3.定义Dao

@Dao
public interface StudentDao {@Insertvoid insert(Student... students);@Deletevoid delete(Student... students);@Updatevoid 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;}@Overrideprotected 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;}@Overrideprotected 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;}@Overrideprotected 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;}@Overrideprotected 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;@Overrideprotected 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>>() {@Overridepublic 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.mzph.cn/diannao/56156.shtml

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

相关文章

Python即时获取上证指数信息并发送邮件到指定邮箱

最近股市振荡&#xff0c;股民会时不时查看一下上证指数信息&#xff0c;但是繁忙的工作却时不是让人忘记了&#xff0c;错过了投资的最佳时机&#xff0c;这时就可以通过Python来爬取网站上的上证指数&#xff0c;并发送到指定的邮箱&#xff0c;这样就不用上指定网页也以获取…

网络断开导致SSH会话和服务端任务终止的原因及使用screen详解

在进行深度学习任务时&#xff0c;常常在本地通过ssh连接远程服务器进行炼丹任务。当我在pycharm上远程连接到服务器上进行训练时&#xff0c;由于网络不稳定使得SSH断开连接&#xff0c;我原以为服务器不会受影响。通过nvidia-smi命令发现GPU占用为0&#xff0c;这才发现任务终…

稀土阻燃协效剂 - 阻燃

金士镧稀土阻燃协效剂的技术衬垫&#xff1a; 金士镧KingCela 稀土阻燃协效剂KCL-FR-06xx系列产品&#xff0c;凭借独特的稀土4f电子层结构, 可协效磷氮阻燃剂&#xff0c;卤系阻燃剂阻燃剂在高分子材料&#xff08;橡胶&#xff0c;塑料&#xff0c;涂层&#xff0c;胶黏剂&a…

『网络游戏』服务器启动逻辑【16】

新建Visual Studio工程命名为NetGameServer 重命名为ServerStart.cs 创建脚本&#xff1a; 编写脚本&#xff1a;ServerRoot.cs 编写脚本&#xff1a;ServerStart.cs 新建文件夹 调整脚本位置 新建文件夹 新建文件夹网络服务 创建脚本&#xff1a;NetSvc.cs 编写脚本&#xff1…

使用 KVM 在 Xubuntu 上创建 Windows 10 虚拟机

目录 前言说明注意准备 iso官网思博主(嘻嘻)拖动到虚拟机里面启动 virt-manager创建虚拟机选择本地安装介质选择 iso配置 内存 和 CPU选择 创建的虚拟机 保存的位置启动虚拟机看到熟悉的 Win10界面前言 XUbuntu安装OpenSSH远程连接服务器 远程连接之MobaXterm安装使用 虚拟化技…

DS线性表之队列的讲解和实现(5)

文章目录 前言一、队列的概念及结构二、队列的实现队列节点和队列初始化销毁判断是否为空入队列出队列获取队头队尾数据获取队列元素个数 三、实际使用效果总结 前言 队列实现源代码   队列是我们遇到的第二个实用数据结构&#xff0c;栈和队列地位等同 一、队列的概念及结构…

一篇python常见的Pandas的数据功能的使用

当我们学习了如何使用 Pandas 进行数据的导入与导出,这为我们后续的数据处理打下了基础.此次我们将重点讨论数据选择与过滤.通过掌握这一部分的知识,你将能够轻松地从复杂的数据集中提取出所需的信息.接下来,我们将通过一些实例来逐步了解这些操作. 这里插播一条粉丝福利&#…

三、AOP

文章目录 1. AOP&#xff08;概念&#xff09;2. AOP&#xff08;底层原理&#xff09;2.1 AOP 底层使用动态代理2.2 AOP&#xff08;JDK动态代理&#xff09; 3. AOP&#xff08;术语&#xff09;3.1 连接点3.2 切入点3.3 通知&#xff08;增强&#xff09;3.4 切面 4. AOP操作…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

SpringBoot人事系统:企业人才资源的智能管家

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

fastadmin 多商户模式下侧边栏跳转路径BUG

记录&#xff1a;仅作自己项目记录&#xff0c;在一个域名下部署多套项目时&#xff0c;若是多商户模式项目会出现跳转路径问题。 修改 \manystore\library\Auth.php 文件的 getSidebar 方法 // 1 改为&#xff1a; $v[url] isset($v[url]) && $v[url] ? $v[url] :…

关于WPF(Windows Presentation Foundation)中Grid控件

本文将从Grid控件的基础概念开始&#xff0c;逐步深入探讨其特性、用法、实例代码&#xff0c;以及最佳实践。 1. WPF和布局简介 WPF是一种用于构建Windows桌面应用程序的UI框架&#xff0c;它通过XAML&#xff08;Extensible Application Markup Language&#xff09;使开…

PDF编辑不求人!4款高效工具,内容修改从此变得简单又快捷

咱们现在生活在一个数字时代&#xff0c;PDF文件可不就是工作、学习还有日常生活中经常要用的东西嘛。但遇到那些需要改动的PDF文件&#xff0c;是不是就觉得有点头疼啊&#xff1f; 因为传统的PDF文件真的不好编辑&#xff0c;这确实挺烦人的。不过呢&#xff0c;我今天要给你…

文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统、短视频推荐等相关内容

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下本文详细介绍了文本语义检索系统的搭建过程&#xff0c;涵盖了召回、排序以及Milvus召回系统的相关内容。通过使用PyTorch框架&#xff0c;我们提供了样例代码&#xff0c;以帮助读者更好地理解和实践。该系统具有广…

VR全景摄影的拍摄和编辑软件推荐

随着虚拟现实技术的不断进步&#xff0c;VR全景摄影逐渐成为商业、娱乐和教育等多个领域中的重要工具。通过专业的设备与软件&#xff0c;摄影师能够创作出沉浸式的360度全景作品&#xff0c;为观众提供身临其境的视觉体验。在这篇文章中&#xff0c;我们将介绍VR全景摄影的相关…

【vue+printJs】前端打印, 自定义字体大小, 自定义样式, 封装共享样式

效果示例 思维导图 目录 1,基本使用1, 依赖下载2, 页面导入3, 修改字体大小(可行但不推荐) 2, 自定义样式,字体大小1, 修改字体大小(推荐)2, 自定义样式3, 封装共享样式 3, 去除页面页脚内容4, 测试案例demo, 直接cv可用5, print-js的其他参数说明 1,基本使用 1, 依赖下载 …

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式&#xff0c;可以使用JacksonTypeHandler处理器。使用方式非常简单&#xff0c;如下所示&#xff1a; 在domain实体类里面要加上&#xff0c;两个注解 TableName(autoResultMap true) 表示自动…

无人驾驶打造“新丝路”,驭势科技在卡塔尔设立研发运营中心

在卡塔尔多哈的街头&#xff0c;除了身穿阿拉伯长袍的人群和悠闲的骆驼队伍之外&#xff0c;又将出现一道全新的风景线&#xff0c;那就是来自驭势科技的无人驾驶车。10月8日&#xff0c;在中关村京港澳青年创新创业中心的协助与对接下&#xff0c;驭势科技在卡塔尔科技园正式成…

<Project-8.1.1 pdf2tx-mm> Python 调用 ChatGPT API 翻译PDF内容 历程心得

原因 用ZhipuAI&#xff0c;测试用的PDF里&#xff0c;有国名西部省穆斯林&#xff0c;翻译结果返回 “系统检测到输入或生成内容可能包含不安全或敏感内容&#xff0c;请您避免输入易产生敏感内容的提 示语&#xff0c;感谢您的配合” 。想过先替换掉省名、民族名等&#xff…

计量校准工作中的误差评定与不确定度

计量校准的目的是确定测量仪器的误差和不确定度&#xff0c;以评估其测量结果的可靠性。误差评定和不确定度计算是计量校准过程中的重要步骤。 误差评定是指通过比较测量仪器的测量结果与已知标准值之间的差异&#xff0c;确定仪器的准确性和精度。误差可以分为系统误差和随机误…