Android Room学习笔记

1,添加KSP插件,在 build.gradle.kts(Project) -> plugins 里添加

复制代码
id("com.google.devtools.ksp") version "2.0.21-1.0.28" apply false // KSP 插件

2,添加KSP插件,在 build.gradle.kts(Module) -> plugins 里添加

复制代码
id("com.google.devtools.ksp") // 应用 KSP 插件

3, 添加Room依赖,在 build.gradle.kts(Module) -> dependencies 里添加

复制代码
implementation ("androidx.room:room-runtime:2.8.4")
implementation ("androidx.room:room-ktx:2.8.4" )// 支持协程
ksp("androidx.room:room-compiler:2.8.4")

4,编写实体类, 新建 Banner.kt,写入

复制代码
@Entity(tableName = "banner")
data class Banner(
    val desc: String,
    @PrimaryKey
    val id: Int,
    val imagePath: String,
    val isVisible: Int,
    val order: Int,
    val title: String,
    val type: Int,
    val url: String
)

5,编写 BannerDao 文件

复制代码
@Dao
interface BannerDao {
    @Query("SELECT * FROM banner")
    suspend fun getBanners(): List<Banner>

    @Query("SELECT * FROM banner WHERE 'id' = :userId")
    suspend fun getBannerById(userId: Int): Banner?

    @Insert(onConflict = OnConflictStrategy.REPLACE) //重复时则会替换。
    suspend fun insert(user: Banner)

    @Delete
    suspend fun delete(user: Banner)

    @Update
    suspend fun update(user: Banner)
}

6,编写 AppDatabase

复制代码
@Database(entities = [Banner::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
    abstract fun bannerDao():BannerDao

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

7,在 ViewModel 里调用

复制代码
class MainViewModel(application: Application) : AndroidViewModel(application) {
    private val _localBanners = MutableStateFlow<List<Banner>>(emptyList())
    val localBanners: StateFlow<List<Banner>> = _localBanners

    fun getLocalBanners() {
        viewModelScope.launch {
            _localBanners.value = AppDatabase.getInstance(application).bannerDao().getBanners()
        }
    }
}
相关推荐
Xudde.39 分钟前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
zzh0813 小时前
MySQL高可用集群笔记
数据库·笔记·mysql
绛橘色的日落(。・∀・)ノ3 小时前
Matplotlib实践学习笔记
笔记·学习
chase。3 小时前
【学习笔记】AGILE:把人形机器人强化学习从“玄学”变成“工程学”
笔记·学习·敏捷流程
久菜盒子工作室4 小时前
高等教育学|第一章高等教育概述
经验分享·笔记·课程设计
tq10864 小时前
语言流形与思维共生:中西认知图景的差异与交融
笔记
YuanDaima20484 小时前
基于 LangChain 1.0 的检索增强生成(RAG)实战
人工智能·笔记·python·langchain·个人开发·langgraph
_李小白5 小时前
【OSG学习笔记】Day 31: 渲染到纹理(RTT)
笔记·数码相机·学习
练习时长一年7 小时前
我的开发笔记
笔记
生瓜硬劈..7 小时前
SQL 调优全解:从 20 s 到 200 ms 的 6 步实战笔记
java·笔记·sql