具有kotlin flow的房间数据库
2022-10-14 本文已影响0人
安安_660c
首先,我们需要为房间数据库设置依赖项,如下所示:
implementation "androidx.room:room-runtime:2.4.3"
kapt "androidx.room:room-compiler:2.4.3"
implementation "androidx.room:room-ktx:2.4.3"
注意:请务必检查最新的可用版本。
不要忘记在应用程序中添加用于注释处理的 Kotlin 插件。
plugins {
id 'kotlin-kapt'
}
现在,创建实体类,如下所示:
@Entity
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "name") val name: String?,
@ColumnInfo(name = "email") val email: String?,
@ColumnInfo(name = "avatar") val avatar: String?
)
对于此实体类,我们需要创建所需的房间数据库。
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Insert
fun insertAll(users: List<User>)
@Delete
fun delete(user: User)
}
现在,我们需要创建一个扩展的类。
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
在此之后,我们将需要一个类。
object DatabaseBuilder {
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
if (INSTANCE == null) {
synchronized(AppDatabase::class) {
if (INSTANCE == null) {
INSTANCE = buildRoomDB(context)
}
}
}
return INSTANCE!!
}
private fun buildRoomDB(context: Context) =
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"learn-kotlin-flow"
).build()
}
之后,我们将创建一个实现接口的类。
class DatabaseHelperImpl(private val appDatabase: AppDatabase) : DatabaseHelper {
override fun getUsers(): Flow<List<User>> = flow {
emit(appDatabase.userDao().getAll())
}
override fun insertAll(users: List<User>): Flow<Unit> = flow {
appDatabase.userDao().insertAll(users)
emit(Unit)
}
}
此外,我们正在使用Flow生成器并根据需要发出项目。
完成此操作后,我们可以创建如下实例:
val dbHelper = DatabaseHelperImpl(DatabaseBuilder.getInstance(applicationContext))
最后,我们可以将此实例传递到任何需要的位置,例如传递给 ,并进行查询以从数据库中获取,如下所示:
class RoomDBViewModel(private val apiHelper: ApiHelper, private val dbHelper: DatabaseHelper) : ViewModel() {
init {
fetchUsers()
}
private fun fetchUsers() {
viewModelScope.launch {
dbHelper.getUsers()
.flowOn(Dispatchers.IO)
.catch { e ->
// handle exception
}
.collect {
// list of users from the database
}
}
}
}
这样,我们就能够在安卓中使用kotlin查询数据库。