首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在android mvvm中我们在哪里改进了call & db CRUD?

在Android的MVVM(Model-View-ViewModel)架构中,CRUD(创建、读取、更新、删除)操作通常涉及到数据层(通常是数据库)和业务逻辑层之间的交互。为了改进这些操作,我们可以从以下几个方面入手:

1. 使用LiveData和ViewModel

基础概念

  • LiveData:是一种可观察的数据持有者类,它可以在数据变化时通知视图。
  • ViewModel:负责持有和管理UI相关的数据,并处理与数据层的交互。

优势

  • 生命周期感知:LiveData能够感知Activity或Fragment的生命周期,只在活跃状态下更新UI。
  • 解耦:ViewModel将UI逻辑与数据层分离,使得代码更易于维护和测试。

应用场景

  • 在ViewModel中使用LiveData来观察数据变化,并更新UI。
  • 使用Repository模式来管理数据源(如数据库、网络API)。

2. 使用协程(Coroutines)

基础概念

  • 协程:是一种轻量级的线程,可以简化异步编程。

优势

  • 简化异步代码:协程使得异步代码看起来像同步代码,减少了回调地狱。
  • 提高性能:协程比传统的线程更轻量,可以创建更多的并发任务。

应用场景

  • 在ViewModel中使用协程来执行数据库操作或网络请求。

3. 使用Room数据库

基础概念

  • Room:是Android官方提供的SQLite数据库抽象层,简化了数据库操作。

优势

  • 类型安全:Room提供了编译时检查SQL查询的功能,减少了运行时错误。
  • 简化数据库操作:Room自动生成DAO接口,简化了CRUD操作。

应用场景

  • 定义实体类和DAO接口,使用Room进行数据库操作。

示例代码

以下是一个简单的示例,展示了如何在MVVM架构中使用LiveData、ViewModel和Room进行CRUD操作:

实体类

代码语言:txt
复制
@Entity(tableName = "user_table")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Int,
    val name: String,
    val email: String
)

DAO接口

代码语言:txt
复制
@Dao
interface UserDao {
    @Query("SELECT * FROM user_table")
    fun getAllUsers(): LiveData<List<User>>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(user: User)

    @Update
    suspend fun update(user: User)

    @Delete
    suspend fun delete(user: User)
}

Repository

代码语言:txt
复制
class UserRepository(private val userDao: UserDao) {
    val allUsers: LiveData<List<User>> = userDao.getAllUsers()

    suspend fun insert(user: User) {
        userDao.insert(user)
    }

    suspend fun update(user: User) {
        userDao.update(user)
    }

    suspend fun delete(user: User) {
        userDao.delete(user)
    }
}

ViewModel

代码语言:txt
复制
class UserViewModel(private val repository: UserRepository) : ViewModel() {
    val allUsers: LiveData<List<User>> = repository.allUsers

    fun insert(user: User) = viewModelScope.launch {
        repository.insert(user)
    }

    fun update(user: User) = viewModelScope.launch {
        repository.update(user)
    }

    fun delete(user: User) = viewModelScope.launch {
        repository.delete(user)
    }
}

总结

通过使用LiveData、ViewModel、协程和Room,我们可以显著改进Android MVVM架构中的CRUD操作。这些技术不仅提高了代码的可维护性和可测试性,还简化了异步编程和数据库操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

拆轮子系列之理解GreenDao框架源码

GreenDao概述 如果Android项目中要使用GreenDAO框架,需要先创建一个Java项目用于生成实体类和DAO类,然后Android项目中使用这些类,在此过程中分别需要对Android项目添加...包的原理很简单,总的来说有四个作用:就是用于生成实体类、DAO类、建立多表之间的关联以及配置实体类的接口和序列化功能 Android项目中用到的最核心的四个类就是:DaoMaster、DaoSession...我们回到DaoMaster的源码,发现在DaoMaster类的构造方法调用了,并且传入了Student.class,所以我们创建DaoMaster对象的时候也同时为EntityDao类和相应的数据库...大部分方法都是进行CRUD操作的,而事实上我们进行CRUD操作都是通过StudentDao对象来进行的,实际上这两种做法没有区别,因为它内部本身就是通过dao对象来进行CRUD操作的,大家看看这些方法的返回值就知道了...实际上DaoSession和StudentDao调用CRUD的方法进行CRUD操作时,其中的查询操作就是最特别的,为什么呢?

1.1K40
  • Android MVVM框架搭建(三)MMKV + Room + RxJava2

    Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一、添加依赖 二、MMKV 1. 初始化 2. 数据存取 3. 使用 三、Room 1....使用 五、源码 前言   在上一篇文章,我讲述了怎么MVVM框架搭建网络访问框架,并通过一个必应的每日壁纸做了一次请求接口的访问演示,这篇文章就需要来讲述Android端的本地数据库的使用和在MVVM...正文   本文说的是数据库,为什么要讲这个呢,因为实际开发,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库即可,需要的时候从数据库获取。...@Entity   下面我们来进行创建,在此之前我现在com.llw.mvvm包下新建一个db包。db包下新建一个AppDatabase类,空类就好。...然后db包下新建一个bean包,bean包下新建一个Image类,我们可以分析一下需要存到数据库的值,是否所有数据都要存入,不要做没必要的事情,那是给自己找事。

    1.3K31

    Android高工面试之旅」疫情失业裸面失败后,花费3个月复习面试了20家公司后收割好运

    思考 这次的面试目标是「Android高工」,那么要思考的是,这个「高」,究竟高在哪里?...我们以一个什么样的工作经验,技术水平,思想深度,才能达到这个高度,这个是要思考的,面试和准备过程我也不断的反思和总结。 面试经历 后来复习了三个月左右。...熟悉framework哪些模块的源码,对图像性能优化有了解吗 以后的技术发展方向是如何的 阿里巴巴P6岗 HTTP2.0与3.0的区别 项目中常用的设计模式 https哪里用了对称加密,哪里用了非对称加密...除了MVP,MVC,MVVM外还有什么其他的架构方式? 动态编译和反射相比,除了性能方面外还有什么区别? 死锁如何避免、处理? Flutter的Widget、State、Context 的核心概念?...这里给大家提供一个方向,进行体系化的学习: 1、看视频进行系统学习 这几年的Crud经历,让我明白自己真的算是菜鸡的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的

    60100

    Android MVVM框架搭建(三)MMKV + Room + RxJava2

    Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一、添加依赖 二、MMKV 1. 初始化 2. 数据存取 3. 使用 三、Room 1....使用 五、源码 前言   在上一篇文章,我讲述了怎么MVVM框架搭建网络访问框架,并通过一个必应的每日壁纸做了一次请求接口的访问演示,这篇文章就需要来讲述Android端的本地数据库的使用和在MVVM...正文   本文说的是数据库,为什么要讲这个呢,因为实际开发,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库即可,需要的时候从数据库获取。...@Entity   下面我们来进行创建,在此之前我现在com.llw.mvvm包下新建一个db包。db包下新建一个AppDatabase类,空类就好。...然后db包下新建一个bean包,bean包下新建一个Image类,我们可以分析一下需要存到数据库的值,是否所有数据都要存入,不要做没必要的事情,那是给自己找事。

    1.2K20

    一种MVVM风格的Android项目架构浅析

    前几天接触公司一Android项目,刚看代码时,不知道这么多层级的代码都是干嘛的,看着有点儿懵。只有清楚了结构和流程,才能够浩瀚的代码里游刃有余。...由于零零散散的业余时间看了点儿,有哪里不对的地方请指正。 何为MVVM?懂web开发的都知道有一种风格叫MVC ,模型,视图,控制器。...当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 由于需要展示内容而涉及的业务逻辑。...Android,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化。 低耦合。以前Activity、Fragment需要把数据填充到View,还要进行一些视图逻辑。...这个应该是 Bean文件夹的MVVM文件夹定义的Bean,以及BaseActivity完成的DataBanding充当了View层。 至此,MVVM 各个层已经介绍完了。

    1.3K20

    Android 架构组件 - 让天下没有难做的 App

    其中 Architecture 部分的组件(Android Architecture Components,以下简称 AAC)组合起来形成了一套完整的架构解决方案,没有更好的方案被发明出来之前,我们姑且把...至此,我们可以确定,无论数据来自 Remote 还是来自本地 DB,架构蓝图中的 Repository 对 ViewModel 提供的数据可以永远是 LiveData 类型,接下来我们看一下 ViewModel...除此之外,ViewModel 也可以用做 MVVM 模式的 VM 层,利用 Data Binding 直接把 ViewModel 的 LiveData 属性绑定到 xml 元素上,xml 声明式的写法避免了很多样板代码...进离场动画和启动选项很好理解,出栈行为是一个比较强大的功能,action 箭头所指的方向表示目标页面入栈,箭头的反方向则表示目标页面出栈,而出栈的行为 Navigation 编辑器完全可控,我们可以指定要出栈到哪个页面...上图表达了数据的流向,如果从 UI 层往回看,页面展示的数据存储 PagedList ,PagedList 只是 DataSource 的数据块(chunk),当 PagedList 需要更多数据时

    1.2K20

    livedatabus详解,阿里是如何用他来做淘宝架构的?

    其中 Architecture 部分的组件(Android Architecture Components,以下简称 AAC)组合起来形成了一套完整的架构解决方案,没有更好的方案被发明出来之前,我们姑且把...至此,我们可以确定,无论数据来自 Remote 还是来自本地 DB,架构蓝图中的 Repository 对 ViewModel 提供的数据可以永远是 LiveData 类型,接下来我们看一下 ViewModel...除此之外,ViewModel 也可以用做 MVVM 模式的 VM 层,利用 Data Binding 直接把 ViewModel 的 LiveData 属性绑定到 xml 元素上,xml 声明式的写法避免了很多样板代码...进离场动画和启动选项很好理解,出栈行为是一个比较强大的功能,action 箭头所指的方向表示目标页面入栈,箭头的反方向则表示目标页面出栈,而出栈的行为 Navigation 编辑器完全可控,我们可以指定要出栈到哪个页面...上图表达了数据的流向,如果从 UI 层往回看,页面展示的数据存储 PagedList ,PagedList 只是 DataSource 的数据块(chunk),当 PagedList 需要更多数据时

    1.2K30

    Jetpack来了:走近Google标准应用架构

    当涉及网络数据获取或数据库CRUD(Create、Retrieve、Update、Delete,即增加、查询、更新、删除)操作时,还需要用到工作线程,进而,我们还不得不考虑Activity/Fragment...因此,我们需要将代码按照功能或类型的不同进行分类,并放到不同的包或类文件,但又不破坏彼此正常的功能和通信。这在软件开发叫作“解耦”。...Android应用程序开发,一直以来都有用到MVC,将Activity/Fragment与布局文件分开就是一种最简单、最基本的MVC思想,只是它没有很好地解决我们的问题,所以才有了MVP和MVVM。...如下图所示,从包名的变化,我们便可以看出,AndroidSupport Library与AAC的各种组件已经迁移到了AndroidX。 ?...他大学期间便开始自学Android研发技术,从事Android研发已有10年,该领域有较为丰富的经验,曾译《Android高性能编程》一书。除了码字,他还十分喜爱阿根廷探戈。

    90920

    Jetpack初步了解

    通常来说,一个Android应用程序至少需要一个Activity,当我们开发小型Android程序时,可能会将大部分代码写在Activity/Fragment,例如业务逻辑,UI控件,数据库的CRUD...因此,我们需要将代码按照功能或类型的不同进行分类,并放到不同的包或类文件,但又不能破坏彼此间正常的通信。这在软件开发叫做解耦,为了将代码解耦以应对日益膨胀的代码量,工程师引入了“架构”的概念。...使得不影响应用程序各模块组件间通信的同时,还能保持模块的相对独立,这样不仅有利于后期的维护,也有利于代码的测试。   关于架构,相信大家多多少少也了解过一点,例如MVC,MVP以及MVVM。...Android开发,一直有用到MVC,例如将Activity/Fragment和布局文件分开就是一种最简单的MVC思想,只是它没有很好地解决我们的问题,所以才有了MVP和MVVM。...Jetpack出来前,Android的应用架构始终处于一个混乱的阶段,Android工程师也非常的困惑,他们不清楚自己使用的架构是否真的是最佳方案,迫切希望Google官方可以推出一些关于架构的组件或指南

    18410

    【Laravel系列4.1】连接数据库与原生查询

    从最早期我们会自己封装一个 MyDB 这种的数据库操作文件,到框架提供一套完整的 CRUD 类,再到现代化的框架的 ORM ,其基础都是变着花样的完成数据操作。...我们还能看到许多其它数据库的配置,不过,今天我们的重点还是 mysql 这个配置。...不过首先,我们要建立一张测试表,之后我们将对这张表进行 CRUD 操作。...代码我们通过 DB 这个门面类的 insert() 方法,就可以实现原生语句的增加操作。对于路由来说,其实我们不用写完全限定命名空间的类名,直接写个 DB 也是可以的。...连接另外一个数据库 上面通过使用原生语句的方式我们可以方便地进行增、删、、查操作了,也就是常说的 CRUD 。接下来我们来看看怎样连接其它的数据库。

    3.2K50

    Android开发模式之MVC,MVP和MVVM的简单介绍与区别

    文章重点: (1)了解并区分MVC,MVP,MVVM。 (2)知道这三种模式Android如何使用。 (3)走出data binding的误区。...水之积也不厚,则其负大舟也无力 正如庄子逍遥游说的,如果水不够深,那就没有能够担负大船的力量 。所以真正开始涉及具体的代码之前,我们要先对MVC,MVP和MVVM做一个初步的了解。...层相关的逻辑抽取了出来,并且相应的时机调用ContributorView接口对应的方法,而我们的activity是实现了这个接口的,自然会走到对应的方法。...接下去让我们开始探索MVVMMVVM最近在Android上可谓十分之火,最主要的原因就是谷歌推出了data binding这个框架,可以轻松的实现MVVM。...你怎么viewmodel层控制?这是view层的东西啊,而且xml也没有,我相信会有解决的方案,但是我们有没有一种更加便捷的方式呢?

    2.7K82

    Jetpack来了:走近Google标准应用架构

    如何把握模块的粒度,保持模块独立性的同时,又不影响模块间的通信,是全世界优秀的Android工程师共同追求的目标。为了解决这一问题,各类架构模式层出不穷,比较著名的有MVC、MVP和MVVM。...它由Google官方推出,用于方便工程师搭建符合MVVM规范的Android应用程序。 本文选自《Android Jetpack应用指南》一书,让我们跟随下文一同走近Google标准应用架构。...当涉及网络数据获取或数据库CRUD(Create、Retrieve、Update、Delete,即增加、查询、更新、删除)操作时,还需要用到工作线程,进而,我们还不得不考虑Activity/Fragment...因此,我们需要将代码按照功能或类型的不同进行分类,并放到不同的包或类文件,但又不破坏彼此正常的功能和通信。 这在软件开发叫作“解耦”。...Android应用程序开发,一直以来都有用到MVC,将 Activity/Fragment 与布局文件分开就是一种最简单、最基本的MVC思想,只是它没有很好地解决我们的问题,所以才有了MVP和MVVM

    72010

    Android MVVM框架使用(十三)UI更新 (App启动白屏优化、适配Android10.0深色模式)

    正文   我的MVVM-Demo的启动也是有白屏的,我们先观察一下啥样。 你多观察一下,会发现有一个短暂的白屏。...二、适配深色模式   Android10.0推出了深色模式,深色模式有以下的优点:更好的用户体验、减少耗电量为弱视以及对强光敏感的用户提高可视性。 那么我们的App怎么去适配这个模式呢?...TabLayout 这里我们只需要一下文字颜色和下划线颜色,你可以能会问,没有背景颜色,这取决于它的父布局,你只需要父布局的背景颜色就行了。 7....WebView设置 WebView也可以设置是否为夜间模式。 10. 地图设置   之前我们App设置了地图,那么同样也是可以根据这个判断去设置当前地图的样式。 这样即可。...下面我们来看一下深色模式的效果图。 三、源码 GitHub:MVVM-Demo CSDN:MVVM-Demo_13.rar

    1.1K10

    Android MVVM框架使用(十一)(功能开发)记事本

    同时也需要一个AndroidManifest.xml的NotebookActivity的主题,如下图所示: 然后我们修改一下EditActivity的代码: public class EditActivity...) { jumpActivity(EditActivity.class); } 当然了,我们的NotebookActivity也需要一个入口,我的MVVM我就在侧滑菜单增加入口...android:title="记事本" /> 添加位置如下图所示: 最后HomeActivity修改一下菜单点击代码,如下图所示: 下面我们运行一下:...NotebookAdapater增加如下图所示代码: 因为我们的NotebookDao并没有通过id查询笔记的方法,因此我们NotebookDao中新加一个,代码如下: @Query("...中去调用EditViewModel的deleteNotebook方法,标题哪里添加一个按钮,修改activity_edit.xml,代码如下: <ImageView

    1.1K40

    【译】Android开发的MVP架构

    介绍Activity是上帝类 首先,让我们思考一下为什么Android开发如此迫切地需要一个清晰的软件架构。 该段摘自“代码大全第二版”: 避免创建神类。避免创建无所不知,无所不能的上帝类。...然而,Android开发,如果你不考虑架构的话,Activity类往往会越来越大。这是因为,Android,允许View和其它线程共存于Activity内。...利与弊 OK,让我们回到MVP架构上。刚刚我们了解了什么是MVP,讨论了MVP以及其它热门架构,并且介绍了MVC,MVP和MVVM三者间的不同。...TopView类,要点如下: TopActivity只是负责处理事件监听或者展示每个视图组件 所有的业务逻辑必须委托给Presenter类 MVP,View和Presenter是一 一对应的(MVVM...Android Architecture(译者注:Android架构) - Thanos Karpouzis 一个Android项目中运用MVC,MVP,MVVM的简单指导。

    51820

    我们使用 MVVM 模式时,我们究竟在每一层里做些什么?

    我们使用 MVVM 模式时,我们究竟在每一层里做些什么?...其中 M 和 V 的中文词语和英文单词是很好理解的,但是 VM 就不是个日常用词;于是各种不知道应该放在哪里的代码便一窝蜂全放进了 VM ,最终导致了 VM 的无限膨胀,成百上千行也是司空见惯啊!...于是那么多的代码写到哪里呢? 答案:MVVM 之外。 ---- 我们的代码不止 MVVM 三层 MVVM 不是应用程序架构,只是一个 GUI 类程序的开发模式而已。...这意味着它只是用来解决我们应用程序 GUI 部分的开发问题,并不能用来解决其他问题。而一个能持续发展的程序怎么能只有 GUI 呢?...MVVM 只是数据驱动型 GUI 程序建议的开发模式;无论是三层的哪一层,本质上都是解决 UI 问题。 而非 UI 问题根本就不在 MVVM 的讨论之列。

    89610
    领券