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()
        }
    }
}
相关推荐
橙光成长2 小时前
android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送
android·1024程序员节
深圳雨林凯AI2 小时前
图案裂变的底色衰减:alpha通道、亮度对比与白墨分色的量化拆解
android
mmsx2 小时前
Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存
android
一支蜉蝣2 小时前
Day26 XD安全学习笔记--PHP 应用&模版引用&Smarty渲染&MVC 模型&数据联动&RCE 安全
笔记·网络安全·html·php
東隅已逝,桑榆非晚3 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
欢欢李3 小时前
【LTE L3 笔记 01】LTE空口特点
笔记·无线通信·物理层·lte·空口协议
ZZHow10244 小时前
神经网络与深度学习笔记_Day1
人工智能·pytorch·笔记·python·深度学习·神经网络·机器学习
ACP广源盛139246256734 小时前
选型笔记:HDMI2.1 四进一出切换中继方案 GSV6705@ACP 评估
笔记·硬件架构·硬件工程·视频·国产芯片
恋猫de小郭4 小时前
Flutter 可以更直接地调用原生 API 了,Dart Direct Native Interop
android·前端·flutter
Z21-X5 小时前
云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践
运维·笔记·学习·云原生·华为云