Android Room数据库LiveData与ViewModel结合使用详解

news2024/11/18 9:40:58

Android Room是Android开发中的一个持久性库处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的使用场景是缓存相关的数据,这样一来,当设备无法访问网络时,用户仍然可以在离线状态下浏览该内容。

Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。主要有以下几大优点:

  • 在编译时校验 SQL 语句;
  • 易用的注解减少重复和易错的模板代码;
  • 简化的数据库迁移路径。

为什么Android Room在Android开发中如此重要?

  • 类型安全的数据库访问: Room使用注解和编译时检查,确保SQL查询的类型安全性。
  • 简化数据库操作: Room大大简化了SQLite数据库的使用。它提供了高级抽象,减少了编写复杂SQL查询的需要。
  • 响应式数据管理: Room与Android架构组件(如LiveData和ViewModel)集成得很好,支持响应式编程。
  • 数据库迁移支持: 当应用程序需要更改数据库结构时,Room提供了方便的数据库迁移工具。
  • 官方支持: Room由Google官方提供和维护,因此它与Android平台的兼容性和可维护性都得到了保证。

Room数据库的使用

(将Room与Android架构组件如LiveData和ViewModel结合使用)

Room主要包含三个组件:

  • Database:其中包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点
  • Entity:用于表示数据库中的表
  • Dao:包含用于访问数据库的方法

其中三个组件的关系如下图所示

编辑切换为居中

添加图片注释,不超过 140 字(可选)

添加依赖 在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

 dependencies {
     // Room数据库依赖
    def room_version = "2.2.6"
​
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    
    // 协程依赖
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.0'
    
    //LiveData和ViewModel依赖 
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
 }

创建实体类

@Entity
data class Record(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val title: String,
    val content: String)

使用id作为主键,令其默认值为0,这样在插入数据库时会自动为其赋值

创建Dao接口
@Dao
interface RecordDao {
​
    @Query("select * from record where title = :title")
    fun getAllRecordsByTitle(title: String): LiveData<List<Record>>
​
}

这里getAllRecords()方法返回LiveData

创建Database
@Database(version = 1, entities = [Record::class])
abstract class AppDatabase : RoomDatabase() {
​
    abstract fun recordDao(): RecordDao
    
    companion object {
        private var instance: AppDatabase? = null
        // 使用单例模式
        @Synchronized
        fun getDatabase(context: Context): AppDatabase {
            instance?.let {
                return it
            }
            return Room.databaseBuilder(context.applicationContext,
                    AppDatabase::class.java, "app_database")
                .build().apply { instance = this }
        }
}

在创建以上几个类时,注意添加对应的注解@Entity,@Dao,@Database

2.ViewModel与LiveData的使用 在MVVM架构中,Repository承担着统筹本地存储与网络数据访问的功能,这里我们仅使用本地存储

在Repository.kt中,添加方法

object Repository {
​
    val recordDao = AppDatabase.getDatabase(DayRecordApplication.context).recordDao()
    
    fun getAllRecordsByTitle(title: String): LiveData<List<Record>> =
        return recordDao.getAllRecordsByTitle(title)
​
}

在viewModel.kt中,使用Transformations进行数据的转换:

private val _record = MutableLiveData<String>()
​
val records: LiveData<List<Record>> = Transformations.switchMap(_records) {
    Repository.getAllRecordsByTitle(it)
}

由于数据库操作是耗时操作,因此需要使用协程来进行异步操作

fun getAllRecordsByTitle(title: String)  = viewModelScope.launch{
    _record.value = title
}

当_record数据发生变动时,会自动通知record数据进行更新

viewModel.kt全部代码如下

class viewModel : ViewModel() {
​
    private val _record = MutableLiveData<String>()
    
    val records: LiveData<List<Record>> = Transformations.switchMap(_record) {
            Repository.getAllRecordsByTitle(it)
    }
    
    fun getAllRecordsByTitle(title: String)  = viewModelScope.launch{
        _record.value = title
    }
​
}

在Activity中,添加Observer来对LiveData进行观察

open class MainActivity : AppCompatActivity() {
​
    private val viewModel by lazy {
        ViewModelProvider(this).get(viewModel::class.java)
    }
    private var records = ArrayList<Record>()
    private lateinit var adapter: RecordAdapter
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        adapter = RecordAdapter(requireActivity(), records)
        viewModel.records.observe(this) {
            // 当viewModel中的records数据更新时
            // 会执行此段代码,进行UI的更新
            records.clear()
            records.addAll(it)
            adapter.notifyDataSetChanged()
        }
        
        button.setOnClickListener {
            // 通知viewModel进行数据变更
            viewModel.getAllRecordsByTitle(title)
        }
        
}

当ViewModel中的records数据进行变更时,会通知adapter进行数据变更从而更新UI。至此,Room、ViewModel、LiveData的搭配使用就完成了。文章主要讲了在Android开发的数据库Room技术中如何去使用,以及简单背景介绍。更详细的Android进阶技术可以参考Android核心技术手册这个模块,里面包含30多个板块上千技术点。可点击查看详情类目。

总结

Android Room是一个强大的数据库持久性解决方案,它简化了数据库访问、提供了类型安全性,并与Android架构组件集成,为Android应用程序的数据管理提供了便利性和可维护性。这让它能成为Android应用程序开发中不可或缺的工具。

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

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

相关文章

使用vlookup函数将数据复制粘贴进筛选后的表中

1、待筛选表A 2、待复制的数据表B 3、筛选表A(性别男)。点击表A内的任意单元格&#xff0c;然后按下筛选的快捷键是ctrlshiftL 4、这是如果复制表B的奖金列&#xff0c;然后粘贴进表A的奖金列&#xff0c;出现这样情况 明显不对&#xff0c;而且少了一个(其实是453顺序粘贴到女…

uni-app 折叠自定义

uni-app的uni-collapse折叠组件样式修改 下面是修改后的样式 <uni-collapse accordion class"ze" v-model"isCollapse" click"toggleCollapse"><!-- 因为list默认带一条分隔线&#xff0c;所以使用 titleBorder"none" 取消…

windows打包uniapp应用p12证书和证书profile文件的制作方法

参考文章1&#xff1a; uniapp打包ios app所需的证书的制作流程-腾讯云开发者社区-腾讯云使用uniapp进行开发&#xff0c;既可以打包小程序&#xff0c;也可以打包app&#xff0c;假如需要打包app&#xff0c;需要p12格式的证书和一个证书profile文件&#xff0c;这个在uniapp…

算法通关村17关 | 盘点面试大热门之区间问题

1. 判断区间是否重叠 题目 LeetCode252 给定一个会议时间安排的数组intervals&#xff0c;每个会议时间都包括开始和结束时间&#xff0c;intervals[i] [start, endi],请你判断一个人是否能参加这里面的全部会议。 思路 遍历所有区间&#xff0c;判断下个区间开始是否小于上…

极轨气象卫星数据中的蝴蝶结(BOW-TIE)处理

李国春 极轨气象卫星多为多扫描单元&#xff08;比方10个SCAN&#xff09;与卫星轨道垂直方向并行扫描。这就像冬天下雪我们拿个笤帚扫院子&#xff0c;一边往前走一边往两边扫。由于极轨气象卫星扫描刈幅&#xff08;SWATH&#xff09;宽、探测距离越往边缘越长&#xff0c;加…

便捷高效的电能管理:利用PLC远程控制网关实时监控配电箱

配电箱是工业生产过程中必不可少的设备&#xff0c;其中的PLC&#xff08;可编程逻辑控制器&#xff09;是实现自动化控制的重要组成部分。为了实时监控配电箱的数据&#xff0c;并进行远程调试上下载与管理控制&#xff0c;我们可以使用PLC数据采集与远程控制网关。 PLC数据采…

RK3588烧录和环境部署

RK3588相关烧录固件请到firefly官网下载&#xff0c;firefly下载地址&#xff0c;环境配置步骤详细说明&#xff1a; 第1步&#xff1a;在win10下安装DriverAssitant目录下的名为DriverInstall.exe的驱动助手&#xff1b; 第2步&#xff1a;运行在RKDevTool目录下的RKDevTool.e…

monkey命令的使用

一、monkey的概念 Monkey是Android中的一个命令行工具&#xff0c;可以运行在模拟器里或者现实设备中&#xff0c;向系统发送伪随机的用户事件流&#xff08;点击、滑动、Application切换、横竖屏、应用关闭&#xff09;实现对正在开发的应用程序进行压力测试。monkey测试是一…

智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”

文明社会的进步离不开公共设施的不断创新和提升。而在这些公共设施中&#xff0c;公共厕所一直是一个备受关注和改善的领域。近年来&#xff0c;随着智慧城市建设的推进&#xff0c;智慧公厕成为了城市管理的重要一环。智慧公厕不仅仅是为公众提供方便和舒适的便利设施&#xf…

效率翻倍:使用 ERP 系统自动执行这 5 项任务

现代商业的特点是企业各个方面都在快速发展&#xff0c;几乎每个想要成功的企业都会面临集成软件解决方案以改善其运营的必要性。保持竞争优势并减少生产所需的资源量对于成功很关键。这就是为什么在业务流程自动化方面&#xff0c;**ERP系统**大有可为。 以下是企业可以从 ER…

安卓应用的MD5、SHA1值和公钥可以这样知道

安卓应用的MD值、SHA1和android公钥&#xff0c;对于没有了解过非对称对称加密&#xff0c;不了解数字证书原理的运维工程师或者前端工程师来说&#xff0c;简直是天书&#xff0c;摸索半天都不知道是什么东西&#xff0c;特别是现在上架需要备案&#xff0c;而备案又要求填写这…

深信服应用交付管理系统远程命令执行漏洞复现

文章目录 深信服应用交付管理系统远程命令执行漏洞复现0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 深信服应用交付管理系统远程命令执行漏洞复现 0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本…

London Dock丨伦敦一区的房产明星,拥揽泰晤士河美景,尽享都市奢华生活

生活在伦敦一区&#xff0c;似乎就意味跻身上流阶层 皆是精英环绕&#xff0c;也为下一代创造了极好的社区氛围 所谓“一方水土养一方人”&#xff0c;泰晤士河穿过的伦敦 也孕育着伦敦人的礼貌绅士与严谨认真。 河流&#xff0c;是城市发展的源头。 源远流长的塞纳河&…

极坐标转化

在数学中&#xff0c;极坐标系是一个二维坐标系统。该坐标系统中任意位置可由一个夹角和一段相对原点—极点的距离来表示。极坐标系的应用领域十分广泛&#xff0c;包括数学、物理、工程、航海、航空以及机器人领域。两点间的关系用夹角和距离很容易表示时&#xff0c;极坐标系…

这几招真管用!找回丢失的iPhone的好方法!

你昂贵的iPhone不见了。它丢了吗?它被偷了吗?如果你把iPhone弄丢了,你可以从各种其他来源找到它,包括iPad、Mac、iCloud和Apple Watch。 你可以使用iCloud网站上的苹果“查找我的”应用程序、你的任何其他苹果设备或你家人注册的设备来追踪它。或者从“查找我的”应用程序…

U盘数据恢复软件推荐,数据恢复就这么简单!

“太让人头疼啦&#xff01;u盘数据总是会丢失&#xff0c;各位友友们有什么好用的u盘数据恢复软件可以推荐吗&#xff1f;真的非常需要&#xff01;” 随着社会的不断发展&#xff0c;u盘已经成为大部分人的日常必备用品。但是在使用的过程中&#xff0c;也会出现各种意外&…

全球色选机市场到2030年将达到44亿美元

色选机是一种通过光学原理对物料进行筛选的设备。它可用于对各种粮食、塑料、矿石等物料进行颜色和杂质筛选&#xff0c;以提高产品质量和回收率。这种设备通常由给料系统、分选系统、真空气路系统和电控系统等组成 根据阿谱尔&#xff08;APO&#xff09;的统计及预测&#xf…

浮动元素导致被遮住元素单击事件不响应

有时候浮动元素会遮住下面元素&#xff0c;并导致下面元素click事件不响应。看如下代码&#xff1a; <template><Base><div class"btn" click"onBtn">被遮挡button</div><div class"left-floating"></div>…

单条视频涨粉50w,逃出大英博物馆背后的逻辑是什么?

为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出8月月度榜单&#xff0c;从创作者、品牌、品类多方面入手&#xff0c;解析月榜数据&#xff0c;为从业者提供参考。 一条视频涨粉50w 情感共鸣是爆火的核心 据8月的『涨粉排行榜』TOP500数据显示&#xff0c…

“大图模型”亮相外滩大会,蚂蚁开创大模型与图计算融合研究

“生成式人工智能是近40年来最重要的技术革命”&#xff0c;这是微软联合创始人比尔盖茨最新的研判。当智能涌现&#xff0c;如何推动科学研究、应用创新&#xff0c;成为业界关注的焦点。 9月7日&#xff0c;在2023外滩大会“新一代数据底座——探索图智能的应用与发展”分论…