Paging3-分页数据加载库(结合Room)

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


前言

上一篇写了Paging3的基本使用. 这一片 结合Room, 实现 NetWork 和 Db 数据处理. 实现 条目增删改操作.

下面是Paging存在的问题:

  • Paging 数据源不开放, 无法随意增删改操作; 只能借助 Room;
  • 这就意味着: 从服务器拉下来的数据全缓存. 刷新时数据全清再重新缓存, 查询条件变更时重新缓存
  • 当Room数据发生变化时, 会使内存中 PagingSource 失效。从而重新加载库表中的数据

官方文档:
Room: 官方文档点这里
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 =
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值