目录
前言
上一篇写了Paging3的基本使用. 这一片 结合Room, 实现 NetWork 和 Db 数据处理. 实现 条目增删改操作.
下面是Paging存在的问题:
Paging 数据源不开放, 无法随意增删改操作; 只能借助 Room;这就意味着: 从服务器拉下来的数据全缓存. 刷新时数据全清再重新缓存, 查询条件变更时重新缓存当Room数据发生变化时, 会使内存中 PagingSource 失效。从而重新加载库表中的数据
官方文档:
Room: 官方文档点这里
Paging3: 官方文档点这里
推荐文章
- ListAdapter封装, 告别Adapter代码 (一)- ListAdapter 入门
- ListAdapter封装, 告别Adapter代码 (二)- SimpleAdapter
- ListAdapter封装, 告别Adapter代码 (三)- 头尾,多类型,嵌套,单多选
- paging3-分页数据加载库(入门)
引入库
//ViewModel, livedata, lifecycle
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0"
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
//协程
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8'
//room
implementation "androidx.room:room-runtime:2.3.0"
kapt "androidx.room:room-compiler:2.3.0"
implementation "androidx.room:room-ktx:2.3.0"
//Paging
implementation "androidx.paging:paging-runtime:3.0.0"
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用步骤
1. 实体类
首先实体类需要映射数据库中的表及字段.
@Entity
class RoomEntity(
@Ignore
//状态标记刷新条目方式, 用于ListAdapter; 但在 Paging 中废弃了
override var hasChanged: Boolean= false,
@ColumnInfo
//选中状态, 这里用作是否点赞.
override var hasChecked: Boolean = false)
: BaseCheckedItem {
@PrimaryKey
var id: String = "" //主键
@ColumnInfo
var name: String? = null //变量 name @ColumnInfo 可以省去
@ColumnInfo
var title: String? = null //变量 title
@Ignore
var content: String? = null //某内容; @Ignore 表示不映射为表字段
@Ignore
var index: Int = 0
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as RoomEntity
if (hasChecked != other.hasChecked) return false
if (name != other.name) return false
return true
}
override fun hashCode(): Int {
var result = hasChecked.hashCode()
result = 31 * result + (name?.hashCode() ?: 0)
return result
}
}
BaseItem
interface BaseItem {
var hasChanged: Boolean
fun getMItemType(): Int = 0
}
interface BaseCheckedItem : BaseItem{
var hasChecked: Boolean // 是否被勾选中
}
2.创建Dao
Room 必备的 Dao类; 这里提供了 5个函数; 看注释就好了.
@Dao
interface RoomDao {
//删除单条数据
@Query("delete from RoomEntity where id = :id ")
suspend fun deleteById(id:String)
//修改单条数据
@Update
suspend fun updRoom(entity: RoomEntity) //修改点赞状态;
//新增数据方式
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(list: MutableList<RoomEntity>)
//配合Paging; 返回 PagingSource
@Query("SELECT * FROM RoomEntity")
fun pagingSource(): PagingSource<Int, RoomEntity>
//清空数据; 当页面刷新时清空数据
@Query("DELETE FROM RoomEntity")
suspend fun clearAll()
}
3.创建 Database
Room 必备的 Database类;
@Database(entities = [RoomEntity::class, RoomTwoEntity::class], version = 8)
abstract class RoomTestDatabase : RoomDatabase() {
abstract fun roomDao(): RoomDao
abstract fun roomTwoDao(): RoomTwoDao
companion object {
private var instance: RoomTestDatabase? = null
fun getInstance(context: Context): RoomTestDatabase {
if (instance == null) {
instance =

本文介绍了如何结合Paging3和Room实现网络数据的加载与数据库的增删改操作。通过创建实体类、Dao、Database,以及重点讲解RemoteMediator的使用,展示了数据源的管理。同时,讨论了Paging存在的数据源不开放和数据变更导致的问题,并给出了ViewModel、DiffCallback的实现。最后,通过示例代码展示了在Fragment中如何使用Paging3加载数据和处理点赞、删除操作。
最低0.47元/天 解锁文章
1168





