kotlinjs css html

具有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查询数据库。

上一篇下一篇

猜你喜欢

热点阅读