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()
}
}
}