如何从Room数据库中获取全部数据项?
如何从Room数据库中获取全部数据项?
1. 编写DAO层查询方法
在Room的DAO接口里,通过@Query注解编写SQL语句,就能获取所有数据;返回Flow<List<Item>>还能自动监听数据更新:
@Dao interface ItemDao { // 查询items表所有数据,按name字段升序排列 @Query("SELECT * from items ORDER BY name ASC") fun getAllItems(): Flow<List<Item>> }
2. 在Compose中获取并使用数据
注意:直接打印getAllItems()的返回值只会得到Flow对象的字符串,拿不到实际数据,得用下面两种方式处理:
方式一:在LaunchedEffect中收集数据
如果只是想获取数据做日志或非UI操作,用collect方法收集Flow:
@Composable fun MyUi(db: AppDatabase) { LaunchedEffect(Unit) { db.itemDao().getAllItems().collect { items -> // 这里拿到的items就是数据库中所有的数据项 Log.d("myTag", "所有数据:$items") } } }
方式二:转成Compose状态用于UI展示(推荐)
如果要把数据显示在UI上,用collectAsStateWithLifecycle把Flow转成Compose状态,数据更新时UI会自动刷新:
@Composable fun MyUi(db: AppDatabase) { // 初始值设为空列表,数据加载完成后会自动更新 val items by db.itemDao().getAllItems().collectAsStateWithLifecycle(initialValue = emptyList()) // 示例:用LazyColumn展示所有数据 LazyColumn { items(items) { item -> Text(text = item.name) } } }
关键提示
Flow是冷流,只有调用collect后才会执行SQL查询,并且持续监听数据变化collectAsStateWithLifecycle会跟随Compose组件的生命周期自动管理收集过程,避免内存泄漏
内容的提问来源于stack exchange,提问作者Jorpy
相关产品推荐
相关产品推荐

