赞
踩
Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:
app/build.gradle
中引入roomimplementation "androidx.room:room-ktx:2.2.5"
kapt "androidx.room:room-compiler:2.2.5"
这个类就是要存储的数据结构,通过@Entity(tableName="test_table")
定义并指定表名。类中的每个属性代表表中的一列。Room 最终会使用这些属性来创建表并将数据库行中的对象实例化
//声明数据表,并且指定数据表名称
@Entity(tableName = "test_table")
data class TestEntity(@PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "name")val name:String)
//如果列名也叫做word可以省略@ColumnInfo
其实就是提供对数据表的增删改查。在 DAO(数据访问对象)中,您可以指定 SQL 查询并将其与方法调用相关联。编译器会检查 SQL 并根据常见查询的方便的注解(如 @Insert
)生成查询。Room 会使用 DAO 为代码创建整洁的 API。DAO 必须是一个接口或抽象类。默认情况下,所有查询都必须在单独的线程上执行。Room 支持 Kotlin 协程,您可使用 suspend
修饰符对查询进行注解,然后从协程或其他挂起函数对其进行调用。
@Dao
interface TestDao {
@Query("SELECT * FROM test_table ORDER BY word ASC")
fun getSavedEntities(): Flow<List<TestEntity>>
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(entity: TestEntity)
@Query("DELETE FROM test_table")
suspend fun deleteAll()
}
@Dao
注解将其标识为 Room 的 DAO 类。suspend fun insert(word: TestEntity)
:声明挂起函数以插入一个字词。@Insert
注解是一种特殊的 DAO 方法注解,使用 DAO 方法注解时,您无需提供任何 SQL!(还有用于删除和更新行的 @Delete
和 @Update
注解)onConflict = OnConflictStrategy.IGNORE
:所选 onConflict 策略将忽略与列表中的现有字词完全相同的新字词。如需详细了解可用的冲突策略,请参阅相关文档。suspend fun deleteAll()
:声明挂起函数以删除所有字词。@Query
注解。@Query
(“DELETE FROM word_table”):@Query
要求您将 SQL 查询作为字符串参数提供给注解,以执行复杂的读取查询及其他操作。Room 数据库类必须是抽象且必须扩展 RoomDatabase。整个应用通常只需要一个 Room 数据库实例。
@Database(entities = arrayOf(TestEntity::class), version = 1, exportSchema = false) public abstract class TestRoomDatabase : RoomDatabase() { abstract fun wordDao(): TestDao companion object { @Volatile private var INSTANCE: TestRoomDatabase? = null fun getDatabase(context: Context): TestRoomDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, TestRoomDatabase::class.java, "test_database" ).build() INSTANCE = instance // return instance instance } } } }
RoomDatabase
.@Database
将该类注解为 Room 数据库,并使用注解参数声明数据库中的实体以及设置版本号。每个实体都对应一个将在数据库中创建的表。数据库迁移这里不介绍了,因此这里已将 exportSchema 设置为 false 以免显示 build 警告。在真实的应用中,可以考虑为 Room 设置一个用于导出架构的目录,以便将当前架构签入版本控制系统。class TestRepository(private val testDao: TestDao) {
val allEntities: Flow<List<TestEntity>> = testDao.getSavedEntities()
@WorkerThread
suspend fun insert(entity: TestEntity) {
testDao.insert(entity)
}
}
这里利用了Hilt。首先在viewModel中查询所有结果,并且将flow转化为liveData,在需要的activity中注册监听。当数据库数据发生变化时,监听器就能收到相应的更改数据,比如调用insert之后
@HiltViewModel
class TestViewModel @Inject constructor(private val repository: TestRepository) :ViewModel() {
val allWords: LiveData<List<Word>> = repository.allEntities.asLiveData()
fun insert(entity: TestEntity) = viewModelScope.launch {
repository.insert(entity)
}
}
以上就是Room的简单使用。
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。