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

在mvvm模式下,使用android room从数据库中提取数据时,逻辑应该放在哪里?

在MVVM(Model-View-ViewModel)模式下,使用Android Room从数据库中提取数据的逻辑应该放在ViewModel中。以下是详细的解释和相关代码示例:

基础概念

  • MVVM模式:MVVM是一种设计模式,将应用程序分为三个主要部分:Model(数据模型)、View(视图)和ViewModel(视图模型)。ViewModel负责处理业务逻辑并将数据呈现给View。
  • Room:Room是Android官方提供的一个数据库框架,用于简化SQLite数据库的使用。

逻辑放置位置

在MVVM模式中,数据提取和处理逻辑应该放在ViewModel中,而不是直接放在Activity或Fragment中。这样做的好处是:

  1. 解耦:ViewModel与UI组件解耦,使得代码更易于测试和维护。
  2. 生命周期感知:ViewModel可以在配置更改(如屏幕旋转)时保持数据,避免数据丢失。
  3. 单一职责原则:ViewModel专注于业务逻辑,而Activity和Fragment专注于UI展示。

示例代码

以下是一个简单的示例,展示如何在ViewModel中使用Room进行数据提取。

1. 定义实体类

代码语言:txt
复制
@Entity(tableName = "user_table")
public class User {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;
    private String email;

    // Getters and Setters
}

2. 定义DAO接口

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

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    void insert(User user);
}

3. 定义数据库

代码语言:txt
复制
@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

4. 创建ViewModel

代码语言:txt
复制
public class UserViewModel extends ViewModel {
    private UserDao userDao;
    private LiveData<List<User>> allUsers;

    public UserViewModel(Application application) {
        UserDatabase database = Room.databaseBuilder(application, UserDatabase.class, "user_database").build();
        userDao = database.userDao();
        allUsers = userDao.getAllUsers();
    }

    public LiveData<List<User>> getAllUsers() {
        return allUsers;
    }

    public void insert(User user) {
        new InsertUserAsyncTask(userDao).execute(user);
    }

    private static class InsertUserAsyncTask extends AsyncTask<User, Void, Void> {
        private UserDao asyncTaskDao;

        InsertUserAsyncTask(UserDao dao) {
            asyncTaskDao = dao;
        }

        @Override
        protected Void doInBackground(final User... params) {
            asyncTaskDao.insert(params[0]);
            return null;
        }
    }
}

5. 在Activity中使用ViewModel

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    private UserViewModel userViewModel;

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

        userViewModel = new ViewModelProvider(this).get(UserViewModel.class);

        userViewModel.getAllUsers().observe(this, new Observer<List<User>>() {
            @Override
            public void onChanged(List<User> users) {
                // Update UI with the list of users
            }
        });
    }
}

参考链接

通过上述代码示例和解释,你应该清楚如何在MVVM模式下使用Android Room从数据库中提取数据,并将逻辑放置在ViewModel中。

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

相关·内容

“终于懂了“系列:Jetpack AAC完整解析(五)DataBinding 重新认知!

Room,实现本地存储 数据库管理,支持LiveData。...1.1 DataBinding 的本质 应该不少人和我以前一样,对 DataBinding 的认知就是 xml逻辑: <TextView android:layout_width...而,文章开头提到的把逻辑放入xml的写法,是不建议的。数据值应 直接反映UI控件需要的结果,而不是作为逻辑条件放在 xml 。...LivaData 的字段 九、XML 尽量 不使用逻辑表达式,把逻辑放在 ViewModel ,控件绑定终态数据 五、总结 本篇 重点讲了 DataBinding 的重新认知:DataBinding...可见DataBinding Jetpack MVVM 架构 还是 有很大优势的。 最后补充说明得了 Jetpack MVVM 架构 的使用注意事项和原则,实际项目使用 应该会很有体会。

1.4K10

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

Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一、添加依赖 二、MMKV 1. 初始化 2. 数据存取 3. 使用 三、Room 1....使用 五、源码 前言   在上一篇文章,我讲述了怎么MVVM框架搭建网络访问框架,并通过一个必应的每日壁纸做了一次请求接口的访问演示,这篇文章就需要来讲述Android端的本地数据库使用和在MVVM...正文   本文说的是数据库,为什么要讲这个呢,因为实际开发,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库即可,需要的时候数据库获取。...Room库会采用编译技术对这个ImageDao 进行实现。 4. 初始化   Room数据库的初始化依然要放在BaseApplication当中,增加一个变量。...使用   在上一篇文章,我将数据请求的代码放在MainRepository,而使用Room数据库的代码也是在这个MainRepository里面,这里面的代码会做改动,而且改动很大。

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

    Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一、添加依赖 二、MMKV 1. 初始化 2. 数据存取 3. 使用 三、Room 1....使用 五、源码 前言   在上一篇文章,我讲述了怎么MVVM框架搭建网络访问框架,并通过一个必应的每日壁纸做了一次请求接口的访问演示,这篇文章就需要来讲述Android端的本地数据库使用和在MVVM...正文   本文说的是数据库,为什么要讲这个呢,因为实际开发,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库即可,需要的时候数据库获取。...Room库会采用编译技术对这个ImageDao 进行实现。 4. 初始化   Room数据库的初始化依然要放在BaseApplication当中,增加一个变量。...使用   在上一篇文章,我将数据请求的代码放在MainRepository,而使用Room数据库的代码也是在这个MainRepository里面,这里面的代码会做改动,而且改动很大。

    1.2K20

    MVVM数据持久化(一)——ROOM的集成

    MVVM数据持久化 之前我们分别介绍了MVVM框架的悲剧,项目搭建以及网络请求,接下来在这篇文章当中,我们来聊一聊MVVM数据持久化的问题,也就是我们常说的缓存 Room Room持久库提供了一个SQLite...能力的同时允许流畅的数据库访问,最主要的是它让SQLiteDatabase的使用变得简单,大大减少了重复的代码,并且把SQL查询的检查放在了编译。...注释包含与数据库相关联的实体列表。 包含一个具有0个参数的抽象方法,并返回用@Dao注释的类。...三者关系图 加入依赖 以上简单的介绍了一Room 下面我们着重介绍如何在我们的框架当中使用 首先加入依赖 implementation 'android.arch.persistence.room...要为一个entity添加索引,@Entity注解添加indices属性,列出你想放在索引或者组合索引的字段。 有时候,某个字段或者几个字段必须是唯一的。

    1.5K20

    “终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!

    这篇,就来探索目前android开发 最优秀、讨论最多的架构模式—— MVVM 。 几个月前,我所在项目完成了 MVVM 的架构改造。这篇开始写之前,我也阅读了大量MVVM文章。...逻辑层:为了实现系统功能而进行的必要逻辑数据层:数据的获取和存储,含本地、server。 正常的开发流程,开始写代码之前 都会有架构设计这一过程。这就需要你选择使用何种架构模式了。...MVVM MVVMAndroid开发是如何实现的呢?接着看~ 到这里你会发现,所谓的架构模式本质上理解很简单。...3.1 Jetpack MVVM 理解 Jetpack MVVMMVVM 模式 Android 开发的一个具体实现,是 Android Google 官方提供并推荐的 MVVM实现方式。...仓库层 要做的主要工作是判断调用方请求的数据应该本地数据获取还是网络数据获取,并将获取到的数据返回给调用方。

    2K10

    是时候更新手里的武器了—Jetpack架构组件简析

    也许你还没有使用这个新的武器,那么我真的建议你去使用,感受这个新武器的快准狠,感受这个新架构的精妙解耦。...今天给大家带来的是Jetpack的架构组件,这个模块的组件可以说就是为MVVM框架服务的,当然每个库也都是可以单独使用的。...” 主要指的就是数据绑定库DataBinding,下面六个方面具体介绍 配置应用使用数据绑定: android { ......这里就不细说了,感兴趣的可以去官网看看 官方文档 Demo代码地址 RoomRoom 持久性库 SQLite 的基础上提供了一个抽象层,让用户能够充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制...Room implementation "androidx.room:room-rxjava2:$room_version" } 2)建立数据库类,声明数据库表成员,数据库名称

    2.9K20

    分享一个我开发的MVVM架构的开源小项目

    MVVM(Model-View-ViewModel)是一种代码架构模式,被广泛应用在Android程序设计领域,类似的架构模式还有MVP、MVC等。...蓝色部分表示的是ViewModel层,ViewModel用于持有和UI元素相关的数据,以保证这些数据屏幕旋转不会丢失,以及负责和仓库之间进行通讯。...黄色部分表示的是仓库层,仓库层要做的工作是自主判断接口请求的数据应该数据库读取还是网络获取,并将数据返回给调用方。...如果是网络获取的话还要将这些数据存入到数据库当中,以避免下次重复网络获取。...接下来灰色部分表示是的本地数据层,实现方式并不固定,我使用了LitePal来进行数据持久化处理,你也可以使用别的框架(这里我没有使用官方的Room还是因为Room真的不太好用)。

    77230

    Google 推荐 MVVM 架构中使用 Kotlin Flow

    Google 推荐 MVVM 使用 Kotlin Flow Google 推荐 MVVM使用 Kotlin Flow我相信如今几乎所有的 Android 开发者至少都听过 MVVM 架构,...Google Android 团队宣布了 Jetpack 的视图模型之后,它已经成为了现代 Android 开发模式最流行的架构之一,如下图所示: ?...,我们来看一 Room 和 Retrofit 数据源的配置。...Kotlin Flow Repositories 使用 如果我们想在 Flow 中使用 Retrofit 或者 Room 进行网络请求或者查询数据库的操作,我们需要将使用 suspend 修饰符的操作放到...}) } } 到这里关于 Kotlin Flow MVVM 当中每层的实践就分析完了,如果使用过 RxJava 的小伙伴们应该会非常熟悉,对于没有使用过 RxJava 的小伙伴们

    4.1K20

    Android Jetpack - Room

    的单一事实来源,允许用户应用内查看关键信息的一致副本,无论用户是否具有互联网连接 处理重要数量的结构化数据的应用程序可以本地保存数据受益匪浅。...DAO 包含用于访问数据库的方法 该应用程序使用 Room 数据库来获取与该数据库关联的数据访问对象或 DAO。...然后,应用程序使用每个 DAO 数据库获取实体,并将对这些实体的任何更改保存回数据库。最后,应用程序使用实体来获取和设置与数据库的表列对应的值 Room 组件关系图 ?...最常见的示例,Repository 实现了用于决定是网络获取数据还是使用在本地数据库缓存的结果的逻辑,既避免了 ViewModel 和数据的直接交互又统一了单一真实数据源的逻辑 Repository... MVVM 架构的位置 ?

    1.9K70

    Android 架构」—— MVVM 详解

    那么应该怎么做呢?—— 使用 架构模式!MVC、MVP、MVVM、...任何一种都要比没有架构设计的流水式代码好得多,MVVMAndroid 开发最好的架构选择之一。...Google 官方也非常支持和鼓励开发者使用这一架构模式。 本教程将为你讲明白到底什么是 MVVM,虽然我也不喜欢理论,但有时候实际操作之前先了解它非常重要,所以请务必耐心看完。...不要把业务逻辑比如数据库操作相关的业务放在 Activities 或 Fragments 。...它负责本地数据库或网络获取数据并操作应用数据。 Repository 具有本地存储和服务器之间的中介这么一个特殊角色,你可以在此检查是否应该在本地缓存远程数据等。...image 这里要提到的最后一件重要事情是你应该始终遵守上面的参考树图,例如,不要让你的 ViewModel 绕过 Repository 直接数据库数据

    1.8K40

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

    前几天接触公司一Android项目,刚看代码,不知道这么多层级的代码都是干嘛的,看着有点儿懵。只有清楚了结构和流程,才能够浩瀚的代码里游刃有余。...千辛万苦做完提取完,可能还会出现很多bug。 这个时候MVVM就闪亮登场了。 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。...Android,布局里可以进行一个视图逻辑,并且Model发生变化,View也随着发生变化。 低耦合。以前Activity、Fragment需要把数据填充到View,还要进行一些视图逻辑。...往下看, 要显示的数据哪里来呢?又是怎么来的呢? 接下来看model文件夹。模型层。...这个应该 Bean文件夹的MVVM文件夹定义的Bean,以及BaseActivity完成的DataBanding充当了View层。 至此,MVVM 各个层已经介绍完了。

    1.3K20

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

    Room 数据库作为数据持久层,其重要性不言而喻,当设备处于离线状态数据库可用于缓存数据;当多个 App 需要共享数据数据库可以作为数据源,但是基于原生 API 徒手写 CRUD 实在是痛苦,虽然...虽然 Realm 也是一个优秀的数据库,但是它并没有内置于 Android 系统,所会增大 apk 的体积,使用 Room 则没有这方面烦恼。...Paging UI 没有办法一次性展示所有的数据,端上的系统资源(电量、内存)也有限制,不可能把所有数据都加载到内存;而且大批量请求数据不但浪费带宽,某些网络情况(弱网、慢网)还会导致请求失败,所以分页是很多情景的刚需...PositionalDataSource - 单页数据以位置为标识,这种模式比较常见,Room 只支持这一种,因为数据库查询以 OFFSET 和 LIMIT 做分页。...上图表达了数据的流向,如果 UI 层往回看,页面展示的数据存储 PagedList ,PagedList 只是 DataSource 的数据块(chunk),当 PagedList 需要更多数据

    1.2K20

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

    Room 数据库作为数据持久层,其重要性不言而喻,当设备处于离线状态数据库可用于缓存数据;当多个 App 需要共享数据数据库可以作为数据源,但是基于原生 API 徒手写 CRUD 实在是痛苦,虽然...虽然 Realm 也是一个优秀的数据库,但是它并没有内置于 Android 系统,所会增大 apk 的体积,使用 Room 则没有这方面烦恼。...Paging UI 没有办法一次性展示所有的数据,端上的系统资源(电量、内存)也有限制,不可能把所有数据都加载到内存;而且大批量请求数据不但浪费带宽,某些网络情况(弱网、慢网)还会导致请求失败,所以分页是很多情景的刚需...Paging 将分页逻辑拆解为三部分: 数据源 DataSource 数据块 PagedList 数据展示 PagedListAdapter DataSource 的数据来源于后端服务或者本地数据库,并且用三个子类来表示三种分页模式...上图表达了数据的流向,如果 UI 层往回看,页面展示的数据存储 PagedList ,PagedList 只是 DataSource 的数据块(chunk),当 PagedList 需要更多数据

    1.2K30

    MVVM归纳总结

    MVVM是Model-View-ViewModel的缩写。是谷歌推出的AAC(Android Architccture Components)的组件实现的官方项目框架。...1、LifeCycle:主要是让自定义类继承它,通过四大主件和application绑定后,通过LifeCycle它的子类对自定义的方法加上生命周期注解后,实现对它父组件的生命周期进行监听。...2、LiveData:主要用于给数据套壳包裹,使数据带有观察者模式特性。当数据变化时,会回调的到该数据的监听方法。...LiveData一般就是与ViewModel结合,对ViewModel里面的数据套壳,对数据监听。还会与Room数据库组件搭配使用,监听数据库数据变化。...要使用Databinding那应该使用DataBinding+ViewModel+LiveData,三者缺一不可。

    1K20

    告诉你 Jetpack+MVVM 组合开发的APP有多优秀!

    现在 Google 的应用市场,大部分 APP 已经开始使用 Android Jetpack。 ? ▲ 2018年版本 Jetpack 的优势有很多: UI和业务逻辑解耦。...OOM 、 NullPointerException …… Android Jetpack 组件的集合可以帮助我们写大量重复的代码的任务,简化复杂的任务,让我们的 BUG 减少,以便让我们把更多的精力放在业务逻辑上...Model-View-ViewModel 这个名字来看,它由三个部分组成,其中视图模型(ViewModel)其实就是 PM 模式的展示模型。...除了我们非常熟悉的 Model、View 和 ViewModel 这三个部分, MVVM 的实现,还引入了隐式的一个 Binder 层,我们要完整的采用 MVVM 必须熟练的掌握 DataBinding...Mvvm Model的功能是什么?缓存有哪些级别,怎样提取Model的基类? Mvvm ViewModel怎样和Jetpack结合,OOM问题在MVVM怎样避免?

    98630

    手把手教你搭建android模块化项目框架(八)小试牛刀——带搜索列表的页面 paging,mvvm及flow的运用

    由于没有后台支持,搜索的结果都是静态页,搜索栏添加的是页码数,理解为实际的搜索条件即可~图片基于我们的模块化设计,我们所有的数据交互将封装在data_xxx模块,这里由于没有后台支持,我随便抓取了一些双色球开奖数据作为基础...由于使用paging作为媒介,所以首先我们common_room_db模块创建entity和dao:@Entity(primaryKeys = ["number", "lotteryType", "...接下来我们feature_xxxx写页面,并创建相关的provider和service_xxx模块,以便跨模块调用。...的两个searchObs和posts这里是由于使用paging,我们反馈到页面上的数据均来源于room,因此我们需要使用flow的方式监听数据库数据的变动,也就是posts,可以看到posts等同于searchObs...的flow模式,并在searchObs值变更,转换为Mediator的查询,查询的结果转换成页面监听的flow,从而达到查询的目的。

    26120

    MVVM框架实现组件化之整体结构

    google官方MVVM框架讲解 我前面对比了MVC和MVP《两张图看懂Android开发MVC与MVP的区别》,可以相对于MVC我们的MVP是有多优越,但是Android开发现在已经开始流行了MVVM...Room 就是一个sqlite数据持久化库,我们也可以使用别的ORM库。...ARouter典型应用 外部URL映射到内部页面,以及参数传递与解析 跨模块页面跳转,模块间解耦 拦截跳转过程,处理登陆、埋点等逻辑 跨模块API调用,通过控制反转来做组件解耦 组件化编译和非组件化编译切换..." 按钮 # isModule是“集成开发模式”和“组件开发模式”的切换开关 isModule=false 然后 module_girls和module_news的build.gradle文件中支持切换...最后预告 后面会有一些列介绍MVVM组件化过程中使用ARouter来跳转Activity和获取Fragment、DataBinding实现数据和UI的互相绑定、Rxjava2和Retrofit2动态数据获取

    1.8K70

    精选Android中高级面试题:性能优化,JNI,设计模式

    内存不够就回收软引用对象 2、内存如果加载一张 500 * 500 的 png 高清图片。应该是占用多少的内存?...2、谈谈 MVC、MVP 和 MVVM,好在哪里,不好在哪里 ?...android 无法做到彻底分离,但在代码逻辑层面一定要分清业务逻辑被放置 model 层,能够更好的复用和修改增加业务。...MVVM:MVP 我们说过随着业务逻辑的增加,UI 的改变多的情况,会有非常多的跟 UI 相关的 case,这样就会造成 View 的接口会很庞大。...对于偏向展示型的 app,绝大多数业务逻辑都在后端,app 主要功能就是展示数据,交互等,建议使用 mvvm。 对于工具类或者需要写很多业务逻辑 app,使用 mvp 或者 mvvm 都可。

    2.6K30

    精选Android中高级面试题 (四):性能优化,JNI,设计模式

    如果内存足够不回收。内存不够就回收软引用对象 2、内存如果加载一张 500*500 的 png 高清图片。应该是占用多少的内存?...2、谈谈 MVC、MVP 和 MVVM,好在哪里,不好在哪里 ?...android 无法做到彻底分离,但在代码逻辑层面一定要分清业务逻辑被放置 model 层,能够更好的复用和修改增加业务。...MVVM:MVP 我们说过随着业务逻辑的增加,UI 的改变多的情况,会有非常多的跟 UI 相关的 case,这样就会造成 View 的接口会很庞大。...对于偏向展示型的 app,绝大多数业务逻辑都在后端,app 主要功能就是展示数据,交互等,建议使用 mvvm。 对于工具类或者需要写很多业务逻辑 app,使用 mvp 或者 mvvm 都可。

    1.1K30

    MVVM伪框架结构和MVCM的实现机制

    早期的应用开发相对简单,因为没有标准的模型层的定义,而控制层又在工程生成留下了很多可供开发者写代码的地方,所以很多开发人员就自然而然的将业务逻辑、网络请求、数据库操作、报文拼装和解析等等全部代码都放入了控制层里面去了...视图模型层的类定义了一个给外部使用的唯一接口来供C层调用。这样我终于把一大部分代码C层抽离出来了。我已经成功的实现了C层的进一步瘦身,并抽象出了一个视图模型层了!...纵观整个iOS和android的所有系统框架库都没有出现过让一批数据结构组成一个层的概念。即使如所谓的存储层也是数据库和表以及数据库引擎三者的结合体为一层。...也就是你所有业务数据和业务实现逻辑应该定义M层里面,而且业务逻辑的实现和定义应该和具体的界面无关,也就是和视图以及控制之间没有任何的关系,它是可以独立存在的,您甚至可以将业务模型单独编译出一个静态库来提供给第三方或者其他系统使用...就是同一个单元调度处理逻辑和功能的构建完全放在了一个地方,但不同的单元逻辑的又分散不同的地方,无法去分类统一管理和维护。因此你无法一子就知道某个功能所有调度到底是如何实现以及在哪里实现的。

    79430
    领券