将 Room 与 LiveData 和其他第三方库一起使用

Android Room+LiveData+ViewModel使用小结 Android Room+LiveData+ViewModel使用小结 一、简介 本文主要说明了如何组合使用Room、LiveData、ViewModel来进行数据的持久化存储 二、具体步骤 1. Room数据库的使用 Room主要包含三个组件: Database:其中包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点 Entity:用于表示数据库中的表 Dao:包含用于访问数据库的方法 其中三个组件的关系如下图所示(摘自Android开发者官网) 添加依赖 在应用或模块的 bu 阅读详情

LiveData 的房间

Room 非常容易支持 LiveData 的集成。您只需要从您的 DAO 方法中返回 LiveData,Room 会为您处理其他所有事情。

使用 LiveData 的可观察查询

执行查询时,您通常希望应用程序的 UI 在数据更改时自动更新。为此,LiveData请在查询方法描述中使用类型的返回值。

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAllLiveData(): LiveData<List<User>>
}

LiveDataRoom 会在数据库更新时生成所有必要的代码来更新。生成的代码如下所示:

@Override
public LiveData<List<User>> getAllLiveData() {
  final String _sql = "SELECT * FROM users";
  final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
  return __db.getInvalidationTracker().createLiveData(new String[]{"users"}, false, new Callable<List<User>>() {
    @Override
    public List<User> call() throws Exception {
      final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
      try {
        final int _cursorIndexOfUid = CursorUtil.getColumnIndexOrThrow(_cursor, "uid");
        final int _cursorIndexOfFirstName = CursorUtil.getColumnIndexOrThrow(_cursor, "first_name");
        final int _cursorIndexOfLastName = CursorUtil.getColumnIndexOrThrow(_cursor, "last_name");
        final List<User> _result = new ArrayList<User>(_cursor.getCount());
        while(_cursor.moveToNext()) {
          final User _item;
          final int _tmpUid;
          _tmpUid = _cursor.getInt(_cursorIndexOfUid);
          final String _tmpFirstName;
          _tmpFirstName = _cursor.getString(_cursorIndexOfFirstName);
          final String _tmpLastName;
          _tmpLastName = _cursor.getString(_cursorIndexOfLastName);
          _item = new User(_tmpUid,_tmpFirstName,_tmpLastName);
          _result.add(_item);
        }
        return _result;
      } finally {
        _cursor.close();
      }
    }

    @Override
    protected void finalize() {
      _statement.release();
    }
  });
}

在上面的代码中,__db.getInvalidationTracker().createLiveData()需要tableNames array、inTransaction布尔标志和computeFunction可调用。

  • tableNames用于RoomTrackingLiveData观察变化。
  • inTransaction指示查询是否必须作为事务执行。
  • computeFunction是一个可调用对象,只要观察到的表有任何更改,就会调用它。

我们还可以看到 的call()方法computeFunction实际执行了我们的查询。当观察者开始观察 LiveData 或观察到的表中发生任何更改时,都会调用它。

使用 RxJava 的房间

为了从你的 DAO 方法返回 RxJava observables,我们需要在我们的build.gradle第一个中添加以下依赖项:

dependencies {
  def room_version = "2.2.5"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version"

  // RxJava support for Room
  implementation "androidx.room:room-rxjava2:$room_version"
}

使用 RxJava 的响应式查询

Room 为 RxJava2 类型的返回值提供以下支持:

  • @QueryPublisher方法:Room 支持类型为 、Flowable和的返回值Observable。
  • @Insert, @Update, 和@Delete方法:Room 2.1.0 和更高版本支持返回值类型Completable,Single和Maybe.
@Dao
interface UserDao {
    @Query("SELECT * from users where uid = :id LIMIT 1")
    fun loadUserById(id: Int): Flowable<User>

    @Insert
    fun insertUsers(vararg users: User): Completable

    @Delete
    fun deleteAllUsers(users: List<User>): Single<Int>
}

这些方法的实现如下所示:

@Override
public Completable insertLargeNumberOfUsers(final User... users) {
  return Completable.fromCallable(new Callable<Void>() {
    @Override
    public Void call() throws Exception {
      __db.beginTransaction();
      try {
        __insertionAdapterOfUser.insert(users);
        __db.setTransactionSuccessful();
        return null;
      } finally {
        __db.endTransaction();
      }
    }
  });
}@Override
public Single<Integer> deleteAllUsers(final List<User> users) {
  return Single.fromCallable(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
      int _total = 0;
      __db.beginTransaction();
      try {
        _total +=__deletionAdapterOfUser.handleMultiple(users);
        __db.setTransactionSuccessful();
        return _total;
      } finally {
        __db.endTransaction();
      }
    }
  });
}@Override
public Flowable<User> loadUserById(final int id) {
  final String _sql = "SELECT * from users where uid = ? LIMIT 1";
  final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
  int _argIndex = 1;
  _statement.bindLong(_argIndex, id);
  return RxRoom.createFlowable(__db, false, new String[]{"users"}, new Callable<User>() {
    @Override
    public User call() throws Exception {
      //Implementation 
    }

    @Override
    protected void finalize() {
      _statement.release();
    }
  });
}

从自动生成的代码中,我们可以看到 Room 正在使用fromCallable()操作符来创建Completable和Single。中,Room 用于创建。RxRoom.createFlowableFlowable.create()Flowable

可调用方法内部的代码call()类似于非反应式实现。

带有 Kotlin 协程的房间

首先,我们需要为 Kotlin 协程支持添加以下依赖项:

dependencies {
  def room_version = "2.2.5"

  implementation "androidx.room:room-runtime:$room_version"
  kapt "androidx.room:room-compiler:$room_version"  // Kotlin Extensions and Coroutines support for Room
  implementation "androidx.room:room-ktx:$room_version"
}

使用 Kotlin 协程编写异步方法

您可以将suspendKotlin 关键字添加到您的 DAO 方法中,以使用 Kotlin 协程功能使它们异步。这确保它们不能在主线程上执行。

@Dao
interface UserDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertUsers(vararg users: User)    @Update
    suspend fun updateUsers(vararg users: User)    @Delete
    suspend fun deleteUsers(vararg users: User)    @Query("SELECT * FROM users")
    suspend fun loadAllUsers(): Array<User>
}

Room 生成上述所有方法的实现。功能的实现suspend与非挂起的非常相似。

@Override
public Object insertUsers(final User[] users, final Continuation<? super Unit> p1) {
  return CoroutinesRoom.execute(__db, true, new Callable<Unit>() {
    @Override
    public Unit call() throws Exception {
      __db.beginTransaction();
      try {
        __insertionAdapterOfUser.insert(users);
        __db.setTransactionSuccessful();
        return Unit.INSTANCE;
      } finally {
        __db.endTransaction();
      }
    }
  }, p1);
}

在这里,异步执行传递的可调用对象。执行不可用。CoroutinesRoom.executeCoroutinesRoom.execute

非挂起函数如下所示:

@Override
public void insertUsers(final User... users) {
  __db.assertNotSuspendingTransaction();
  __db.beginTransaction();
  try {
    __insertionAdapterOfUser.insert(users);
    __db.setTransactionSuccessful();
  } finally {
    __db.endTransaction();
  }
}

两种实现之间的唯一区别是,在suspend函数的情况下,CoroutinesRoom.execute负责暂停执行流。

这完全是关于在 Room 中使用 LiveData、RxJava 和 Kotlin 协程。

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击微信卡片即可免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

如何使用LiveData实现Room数据库的数据变化监听? 通过使用 Room 框架提供的 LiveData 类,我们可以很方便地实现监听数据库数据变化刷新页面的效果。LiveData 是一种可以感知 Activity 或 Fragment 生命周期的观察者,可以在数据发生变化时自动通知 UI 进行更新。我们可以在 DAO 接口中定义返回 LiveData 的方法,然后在 Activity 或 Fragment 中注册 LiveData 观察者,并在数据库操作触发数据变化时自动更新 UI。 阅读详情

相关推荐

海外直播、聊天交友APP的开发及上架GooglePlay体验【Compose版】

前言 Jetpack Compose在2021年7月底的时候正式发布了Release 1.0版本,在8月中旬的时候正好赶上公司海外项目计划重构,于是主动请缨向领导申请下来了此次开发的机会。由于之前一直在关注Compose,所以直接扬言要使用Compose来完成全部的UI(事实上也基本达到了目的)。 原本的项目是2017年基于Java+MVP++等的架构,此次则全部推倒重来,基于Kotlin+MVVM/MVI+Jetpack++等的架构。 ​ 此次项目重构涉及的技术点如下: Kotlin Coroutin

乐翁龙 8880

Ajax工作流程

Ajax工作流程 An event occurs(发生) in a web page (the page is loaded, a button is clicked)(发生事件) An XMLHttpRequest object is created by JavaScript(创建xmlHttpRequest交互对象) The XMLHttpRequest object sends a request to a web server(xmlHttpRequest发送请求) 服务器使用JSP,PHP

qq_30906791的博客 364

了解Android常用的第三方库

3. **Volley**: Google开发的网络请求库,适合图片和JSON的请求。4. **Android Eventbus**: 一个事件分发库,用于组件间的通信。1. **Room**: SQLite的抽象层,提供了流畅的访问数据库的API。1. **Glide**: 一个快速高效的图片加载和缓存库,支持GIF和视频。2. **Realm**: 一个跨平台的移动数据库解决方案,用于对象的持久化。2. **Picasso**: 一个强大的图片加载库,简化了图片的异步加载。

Dyan_csdn的博客 1430

【Jetpack】Room + ViewModel + LiveData 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

一、Room + ViewModel + LiveData 框架使用核心要点 1、Room 框架优化分析 2、Google 官方建议的 Room + ViewModel + LiveData 架构 3、Room 与 LiveData 结合使用要点 4、Repository 层核心要点 5、ViewModel + Room 结合使用 6、Activity 组件中 ViewModel 使用要点 7、Room 框架主动查询数据库数据需保留除 LiveData 返回值外的正常查询方法 二、完整代码示例 1、buil

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9070

Android LiveData 详解及使用

文章目录一、`LiveData`是什么?二、`LiveData`的优点三、使用 `LiveData` 对象创建 `LiveData`对象观察 `LiveData` 对象更新 `LiveData`对象将 `LiveData` 与 Room 一起使用四、应用架构中的 `LiveData`五、扩展 `LiveData`六、转换 `LiveData`创建新的转换七、合并多个 `LiveData` 源七、合并多个 `LiveData` 源 一、LiveData是什么? LiveData 是一种可观察的数据存储器类。

klylove的博客 1万+

Android Jetpack组件:LiveData与Room

LiveData与Room作为Android Jetpack组件的核心成员,为Android应用的数据处理和界面更新提供了强大的支持。本文从LiveData与Room的优势、应用场景、结合使用以及最佳实践等方面进行了详细阐述。在实际开发中,合理使用LiveData与Room,可以简化代码、提高应用性能,并为用户提供更好的体验。在未来,我们可以进一步研究LiveData与Room在性能优化、数据安全等方面的应用,以充分发挥它们的优势。

2501_92487807的博客 809

Android开发环境搭建与基础架构解析

Android开发环境搭建是移动应用开发的第一步,其中Android Studio作为官方IDE集成了完整的工具链。开发环境配置涉及SDK管理、模拟器设置等基础操作,而理解Android应用的基础架构(如四大组件和项目结构)是开发的核心。现代Android开发推荐使用MVVM架构,结合ViewModel、LiveData等组件提升代码质量。对于初学者,从简单的天气预报或待办事项应用入手,逐步掌握网络请求、数据存储等关键技术点,是快速入门Android开发的有效路径。开发过程中合理使用Logcat调试和ADB

weixin_34221332的博客 365

Android_Jetpack:Room与LiveData、ViewModel的结合使用

如果不使用LiveData自动获取数据的变化,那么当每次数据库中的数据发生变化时,我们都要开启一个工作线程去重新获取数据库中的数据。 比如说,在进入页面时,要获取数据库中全部学生信息列表,一般我们会这么写: thread{ studentList = studentDao.getStudentList() as MutableList<Student> runOnUiThread { arrayAdapter = ArrayAdapter(this,android

nanquan11的博客 1538

android arch,Android mvvm arch的一次架构实现

兄dai,2019的寒冷不知道你感受到了没,反正我已经两个月没有发工资了,作为一个开发没有了工资就等于没有了灵魂,但一切为了运行的更加丝滑,哥们把一篇mvvmClient奉上。先放图屏幕快照 2019-01-06 上午11.00.01.png屏幕快照 2019-01-06 上午11.01.05.png屏幕快照 2019-01-06 上午11.02.05.png....就这些了,毕竟这次界面不是重点...

weixin_31526891的博客 366

android-room-livedata:带有Android Room和LiveData的示例应用

android-room-livedata 带有Android Room和LiveData的示例应用

REST-meta-MDD Data总结

sMRI数据使用:nwc1、nwc2、nwc3(同样数据集相关论坛中有相关信息指向需要使用wc1、wc2、wc3)多方咨询与讨论后决定使用nwc数据,这里说明wc数据相对wc数据要大的多如wc1的大小为1.33GB,而nwc1的数据却有6.90GB。VBM文件:/REST-meta-MDD/Sharing/REST-meta-MDD-VBM- phase1 -Sharing.tar.gz。1、Excel中的表型信息:1-男,2-女;-9999或空白表示缺少数据。

2404_88295660的博客 1541

LiveData结合Room数据库使用以及线程问题

在LiveData的官方文档中有提到LiveData可以和Room数据库一起使用 也就是说Room查询时可以直接返回一个LiveData对象,给这个LiveData对象添加观察者之后只要数据库数据发生改变都可以收到回调。 Room的使用不在这里说了,直接贴上代码 添加依赖: androidTestImplementation "android.arch.persistence.room:...

祁门路搅屎王的博客 9462

Docker+vLLM内网离线部署Qwen3 流程

本文介绍了在CentOS 7系统下进行VLLM容器化部署Qwen3-32B大模型的内网离线方案。首先需准备Nvidia显卡驱动、CUDA 12.4和Docker环境。通过联网机器拉取vllm/vllm-openai镜像并导入内网服务器,同时从魔塔社区下载模型文件。部署时使用docker run命令启动容器,配置了GPU资源、内存共享、端口映射等参数,特别指定了模型路径、并行计算、内存利用率等关键参数。该方案实现了大模型在内网环境的安全高效部署,适用于需要离线运行的AI推理场景。

qq_42881308的博客 1043

Room是怎样和LiveData结合使用的?(源码分析)

前言 之前写项目的时候,对于数据库的操作不是特别多,能避免就尽量避免,并且一直想不到比较好的方法去组织网络数据、本地数据的逻辑。所以在最近的面试中时,问及项目中的数据库实现,以及比较好用的数据库的框架及其实现原理时,我就只答道之前在《第一行代码》中看到了的LitePal,但源码就...所以这次来恶补一次数据库。几经搜索,云比较,比较青睐官方Jetpack组件中的Room。 Room简介 Room框...

weixin_34358092的博客 2455

CocosCreator 面试题(十七)Cocos creator 固定宽度与固定高度的底层原理是什么?Cocos creator是如何做适配的?

通过固定宽度或固定高度的适配方式,可以使游戏在不同屏幕尺寸上保持一定的一致性,确保游戏中的元素的大小和位置相对稳定。具体选择哪种适配方式取决于你的游戏需求和设计考虑。在 Cocos Creator 中,你可以通过设置「设计分辨率」和使用相对坐标和布局方式来实现固定宽度或固定高度的适配。总之,Cocos Creator 提供了多种适配方式和工具,帮助你在不同屏幕尺寸上保持游戏画面的一致性。在 Cocos Creator 中,固定宽度和固定高度是两种常见的适配方式,用于在不同屏幕尺寸上保持游戏画面的一致性。

w风雨无阻w的专栏 1688

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 231

LiveData+Room

首先使用的数据库是一个面向关系的数据库,将面向对象的语言和面向关系的数据库结合在一起就是ORM,即对象关系映射而Room就是有这样的一个ORM框架Room 是一个数据库对象映射库,可以轻松访问 Android 应用程序上的数据库。Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:针对 SQL 查询的编译时验证。可最大限度减少重复和容易出错的样板代码的方便注解。简化了数据库迁移路径。用。

m0_61130325的博客 1318

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1931

Room与LiveData、ViewModel结合使用(二)

直接使用Room的劣势 Android在UI线程不能执行耗时操作,在工作线程不能刷新UI(别在这抬杠,我知道一些情况下可以)而我们的数据更新变化了自然需要给用户展示出来看,但是数据变化又在工作线程,这就涉及到线程间通信,很不方便。虽然我们有Hander,AsyncTask,runOnUiThread等等很多好用的原生支持,甚至还有很多第三方库,但这些目前看来都不是最优解。 解决方案 在以往我们数据发生变化时都需要再去在工作线程中查询一遍数据然后把数据再给到UI线程去刷新,但是现在我们希望数据发生变化时,

junling_的博客 2279

本地Pycharm连接远程服务器详细配置过程(直接在本地使用服务器显卡,很棒)

相信很多人都遇见过这种情况:实验室成员使用同一台服务器,每个人拥有自己的独立账号,我们可以使用服务器更好的配置完成实验,毕竟自己哪有money拥有自己的3090呢。

NorthSmile的博客 4万+

基于POD和神经网络的多工况温度场重构反演系统

本文提出了一种基于本征正交分解(POD)和神经网络的多工况温度场重构反演系统。该系统通过POD方法从多工况温度场数据中提取主要特征模态,构建神经网络模型建立工况参数与POD模态系数的映射关系,实现温度场的快速重构。系统采用Python实现,包含数据预处理、POD分解、神经网络训练和温度场重构等模块。实验结果表明,该方法能够有效降低计算复杂度,实现高精度的温度场预测。

huanghm88的专栏 277

Android:使用 Room 和 LiveData 实现响应式数据管理:以用户管理应用为例

Room是 Android Jetpack 提供的一个持久化库,它简化了 SQLite 数据库的操作,使得开发者能够更加轻松和高效地管理应用的数据。Room 对 SQLite 进行了封装,提供了简单且强大的 API,让开发者能够以更为声明式的方式与数据库进行交互。在 Room 中,开发者不再需要手动编写 SQL 语句,而是通过注解来定义实体类和数据访问对象(DAO)。Room 会自动生成实现代码,从而简化了开发过程,减少了出错的可能性。LiveData。

fjnu_se的博客 1354

【Flutter 问题系列第 16 篇】如何防止软键盘弹出后顶掉内容

Flutter 如何防止软键盘弹出后顶掉内容

“Allen Su”的博客 3317

LiveData是如何感知Room数据变化的

至此,RoomTrackingLiveData完美实现了数据库发生变化时,会主动将新的数据上报给开发者的功能。由上可知,room配合livedata使用时,之所以livedata能够自动感知数据库数据变化,是由。这里讨论的LiveData的创建是特指Dao定义的方法的返回类型,而不是所有的LiveData。如果有两个进程同时关联了同一个数据库,如果一个进程对此数据库的数据进行改变,那么另一个进程的。方法会在调用数据库的增删改方法时触发,另一个方法。至此,room框架完成了一次完美的跨进程通讯。

weixin_43700867的博客 1205

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 最常用的 Android Studio 快捷键
下一篇: Flutter:如何使用 ListView.separated Widget 在 listView 中添加分隔线
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值