Jetpack之Room的使用,结合Flow,2024最新Android知识体系总结

ok,基本概念了解之后,看一下具体是怎么搞的。

Entity

@Entity(tableName = “t_history”)

data class History(

/**

  • @PrimaryKey主键,autoGenerate = true 自增

  • @ColumnInfo 列 ,typeAffinity 字段类型

  • @Ignore 忽略

*/

@PrimaryKey(autoGenerate = true)

@ColumnInfo(name = “id”, typeAffinity = ColumnInfo.INTEGER)

val id: Int? = null,

@ColumnInfo(name = “name”, typeAffinity = ColumnInfo.TEXT)

val name: String?,

@ColumnInfo(name = “insert_time”, typeAffinity = ColumnInfo.TEXT)

val insertTime: String?,

@ColumnInfo(name = “type”, typeAffinity = ColumnInfo.INTEGER)

val type: Int = 1

)

  • Entity对象对应一张表,使用@Entity注解,并声明你的表名即可

  • @PrimaryKey 主键,autoGenerate = true 自增

  • @ColumnInfo 列,并声明列名 ,typeAffinity 字段类型

  • @Ignore 声明忽略的对象

很简单的一张表,主要是nameinsertTime字段。

DAO

@Dao

interface HistoryDao {

//按类型 查询所有搜索历史

@Query(“SELECT * FROM t_history WHERE type=:type”)

fun getAll(type: Int = 1): Flow<List>

@ExperimentalCoroutinesApi

fun getAllDistinctUntilChanged() = getAll().distinctUntilChanged()

//添加一条搜索历史

@Insert

fun insert(history: History)

//删除一条搜索历史

@Delete

fun delete(history: History)

//更新一条搜索历史

@Update

fun update(history: History)

//根据id 删除一条搜索历史

@Query(“DELETE FROM t_history WHERE id = :id”)

fun deleteByID(id: Int)

//删除所有搜索历史

@Query(“DELETE FROM t_history”)

fun deleteAll()

}

  • @Insert:增

  • @Delete:删

  • @Update:改

  • @Query:查

这里有一个点需要注意的,就是查询所有搜索历史返回的集合我用Flow修饰了。

只要是数据库中的任意一个数据有更新,无论是哪一行数据的更改,那就重新执行 query操作并再次派发Flow

同样道理,如果一个不相关的数据更新时,Flow也会被派发,会收到与之前相同的数据。

这是因为 SQLite 数据库的内容更新通知功能是以表 (Table) 数据为单位,而不是以行 (Row) 数据为单位,因此只要是表中的数据有更新,它就触发内容更新通知。Room 不知道表中有更新的数据是哪一个,因此它会重新触发 DAO 中定义的 query 操作。您可以使用 Flow 的操作符,比如 distinctUntilChanged 来确保只有在当您关心的数据有更新时才会收到通知。

//按类型 查询所有搜索历史

@Query(“SELECT * FROM t_history WHERE type=:type”)

fun getAll(type: Int = 1): Flow<List>

@ExperimentalCoroutinesApi

fun getAllDistinctUntilChanged() = getAll().distinctUntilChanged()

数据库

@Database(entities = [History::class], version = 1)

abstract class HistoryDatabase : RoomDatabase() {

abstract fun historyDao(): HistoryDao

companion object {

private const val DATABASE_NAME = “history.db”

private lateinit var mPersonDatabase: HistoryDatabase

//注意:如果您的应用在单个进程中运行,在实例化 AppDatabase 对象时应遵循单例设计模式。

//每个 RoomDatabase 实例的成本相当高,而您几乎不需要在单个进程中访问多个实例

fun getInstance(context: Context): HistoryDatabase {

if (!this::mPersonDatabase.isInitialized) {

//创建的数据库的实例

mPersonDatabase = Room.databaseBuilder(

context.applicationContext,

HistoryDatabase::class.java,

DATABASE_NAME

).build()

}

return mPersonDatabase

}

}

}

  • 使用@Database注解声明

  • entities 数组,对应此数据库中的所有表

  • version 数据库版本号

注意:

如果您的应用在单个进程中运行,在实例化 AppDatabase 对象时应遵循单例设计模式。 每个 RoomDatabase

实例的成本相当高,而您几乎不需要在单个进程中访问多个实例。

使用

=============================================================

在需要的地方获取数据库

mHistoryDao = HistoryDatabase.getInstance(this).historyDao()

获取搜索历史

private fun getSearchHistory() {

MainScope().launch(Dispatchers.IO) {

mHistoryDao.getAll().collect {

withContext(Dispatchers.Main){

//更新ui

}

}

}

}

collectFlow获取数据的方式,并不是唯一方式,可以查看文档

为什么放在协程里面呢,因为数据库的操作是费时的,而协程可以轻松的指定线程,这样不阻塞UI线程。

查看Flow源码也发现,Flow是协程包下的

package kotlinx.coroutines.flow

以collect为例,也是被suspend 修饰的,既然支持挂起,那配合协程岂不美哉。

@InternalCoroutinesApi

public suspend fun collect(collector: FlowCollector)

保存搜索记录

private fun saveSearchHistory(text: String) {

MainScope().launch(Dispatchers.IO) {

mHistoryDao.insert(History(null, text, DateUtils.longToString(System.currentTimeMillis())))

}

}

清空本地历史

private fun cleanHistory() {

MainScope().launch(Dispatchers.IO) {

mHistoryDao.deleteAll()

}

}

作者:https://blog.csdn.net/yechaoa

数据库升级

================================================================

数据库升级是一个重要的操作,毕竟可能会造成数据丢失,也是很严重的问题。

Room通过Migration类来执行升级的操作,我们只要告诉Migration类改了什么就行,比如新增字段或表。

定义Migration类

/**

  • 数据库版本 1->2 t_history表格新增了updateTime列

*/

private val MIGRATION_1_2: Migration = object : Migration(1, 2) {

override fun migrate(database: SupportSQLiteDatabase) {

database.execSQL(“ALTER TABLE t_history ADD COLUMN updateTime String”)

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

image

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

image

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Jetpack是一组用于Android应用程序开发的库集合,旨在帮助开发者简化开发流程、提高生产力和应用性能。它提供了一些常用的组件和工具,可以帮助开发者解决常见的开发问题。 要使用Android Jetpack,您需要在您的项目中添加相关的Jetpack库依赖。您可以通过在项目的build.gradle文件中添加相应的依赖来实现。例如,要使用Navigation组件,您可以添加以下依赖: implementation "androidx.navigation:navigation-fragment-ktx:2.3.5" implementation "androidx.navigation:navigation-ui-ktx:2.3.5" 一旦您添加了所需的依赖,您可以开始使用Jetpack组件了。对于Navigation组件,您可以使用Navigation图形化界面来创建和管理应用程序中的导航结构,并使用NavController来处理导航操作。 另外,为了更好地理解和学习Android Jetpack,您可以借助官方文档和示例代码来深入学习。官方文档提供了详细的介绍和用法示例,而示例代码可以帮助您更好地理解如何在实际项目中应用Jetpack组件。 总结起来,要使用Android Jetpack,您需要添加相关的库依赖,并根据具体的组件使用文档进行配置和使用。通过深入学习官方文档和示例代码,您可以更好地理解和掌握Jetpack使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Android Jetpack架构开发,从入门到实战,看这一篇就够了](https://blog.csdn.net/Eqiqi/article/details/127534594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Android JetPack学习](https://blog.csdn.net/weixin_39069034/article/details/100170739)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值