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()
        }
    }
}
相关推荐
恋猫de小郭5 小时前
你是不是觉得 R8 很讨厌,但 Android 为什么选择 R8 ?也许你对 R8 还不够了解
android·前端·flutter
EmbedLinX7 小时前
嵌入式Linux之U-Boot
linux·服务器·笔记·学习
城东米粉儿7 小时前
Android Glide 笔记
android
城东米粉儿7 小时前
Android TheRouter 笔记
android
今儿敲了吗9 小时前
23| 画展
c++·笔记·学习·算法
山岚的运维笔记11 小时前
SQL Server笔记 -- 第68章:内存中 OLTP(Hekaton)
数据库·笔记·sql·microsoft·sqlserver
winfreedoms12 小时前
ROS2机械臂——黑马程序员ROS2课程上课笔记(3)
arm开发·笔记
山岚的运维笔记12 小时前
SQL Server笔记 -- 第67章:数据库邮件(DBMAIL)
数据库·笔记·sql·microsoft·sqlserver
菩提小狗13 小时前
第15天:信息打点-主机架构&蜜罐识别&WAF识别&端口扫描&协议识别&服务安全_笔记|小迪安全2023-2024|web安全|渗透测试|
笔记·安全·架构
城东米粉儿13 小时前
Android AIDL 笔记
android