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 小时前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏2 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧3 小时前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄3 小时前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭3 小时前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景4 小时前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev5 小时前
GreenDAO → Room
android·java·kotlin
weiggle5 小时前
第八篇:ViewModel + Compose——生产级状态管理实践
android
恋猫de小郭10 小时前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
plainGeekDev12 小时前
ButterKnife → ViewBinding
android·java·kotlin