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()
        }
    }
}
相关推荐
码途漫谈6 小时前
Easy-Vibe开发篇阅读笔记(四)——前端开发之结合 Agent Skills 美化界面
人工智能·笔记·ai·开源·ai编程
糖炒栗子03268 小时前
【笔记】高分卫星影像 TIF 切片处理
笔记
Nice_Fold9 小时前
Kubernetes DaemonSet、StatefulSet与Service(自用笔记)
笔记·容器·kubernetes
ZhiqianXia11 小时前
《The Design of Design》阅读笔记
前端·笔记·microsoft
饭小猿人12 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
祁白_12 小时前
nmap工具笔记整理
笔记·web安全·测试
_李小白12 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
美狐美颜SDK开放平台12 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
南境十里·墨染春水12 小时前
C++笔记 STL——set
开发语言·c++·笔记
d111111111d12 小时前
直流电机位置式 PID 控制 和 舵机的区别
笔记·stm32·单片机·嵌入式硬件·学习