本章内容:项目引入room数据库的全流程,room数据库的各种增删改查语句,以及大数据的分页查询
1.引入room库

dependencies{
 //room数据库
    //ktx
    implementation 'androidx.core:core-ktx:1.7.0'
    // room
    implementation "androidx.room:room-ktx:2.4.2"
    kapt "androidx.room:room-compiler:2.4.2"
}

1.创建model

@Entity(tableName = "video_path_table")
data class VideoModel(
    @PrimaryKey(autoGenerate = true)
    var uid: Int = 0,
    @ColumnInfo(name = "video_id")
    var videoId: Int ?= 0,
    @ColumnInfo(name = "name")  //序号
    var name: String? = "",
    /**
     * 歌曲照片
     */
    @ColumnInfo(name = "image_path")  //歌名
    var imagePath: String? = null,
    /**
     * 作家
     */
    @ColumnInfo(name = "singer")  //作者
    var singer: String? = null,
    /**
     * 路径
     */
    @ColumnInfo(name = "video_path")  //本地路径
    var videoPath: String? = null,
    /**
     * 时长
     */
    @ColumnInfo(name = "duration")  //时长
    var duration: Long ?= 0,
    /**
     * 文件大小
     */
    @ColumnInfo(name = "size")  //大小
    var size: Long ?= 0,
    @ColumnInfo(name = "resources")  //封面ID
    var resources: Int ?= 0,
    @ColumnInfo(name = "resolution_power")  //分辨率
    var  resolutionPower:String?=null,
    @ColumnInfo(name = "sort")  //排序方式
    var sort:Int ?=0,
    /**
     * 是否正在播放
     */
    @Ignore
    var isPlaying :Boolean?= false,
    /**
     * 是否被选中
     */
    @Ignore
    var isSelect :Boolean?= false,
)

3.创建RoomDatabase

/**
 * describe :创建的表。还可以指定版本。entities = {SongModel.class, Student.class创建多张表
 *   private var dao = AppDatabase.getDatabase().filePathDao()
 */
@Database(entities = [SongModel::class,VideoModel::class], version = 1, exportSchema = true)
abstract class AppDatabase : RoomDatabase() {
    //注释2处
    abstract fun videoDao():VideoDao

    //获取单例
    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        @Synchronized
        fun getDatabase(): AppDatabase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }
            synchronized(this) {
                //注释3处
                var path = Environment.getExternalStorageDirectory().absolutePath + "/sqliteFolder/"
                if (!File(path).exists()) {
                    Log.d("TestFile", "Create the file:$path")
                    File(path).parentFile.mkdirs()
                }
                val instance = Room.databaseBuilder(App.context,
                    AppDatabase::class.java,//"file_data.db")
                    path+"file_data.db")
//新增字段的操作       .addMigrations(MIGRATION_1_2)
       // 允许在主线程操作数据库,一般不推荐;设置这个后主线程调用增删改查不会报错,否则会报错
                    .allowMainThreadQueries()
                    .build()
                INSTANCE = instance
                return instance
            }
        }
    }

    //新增字段的操作
//    var MIGRATION_1_2: Migration = object : Migration(1, 2) {
//        override fun migrate(@NonNull database: SupportSQLiteDatabase) {
//            database.execSQL("alter table users add column user_sex text")
//        }
//    }
}

4.编写Dao,编写room数据库增删改查语句

@Dao
interface VideoDao {
    @Insert
    fun insert(vararg bean: VideoModel)

    @Delete
    fun delete(vararg bean: VideoModel):Int

    @Update
    fun update(vararg bean: VideoModel):Int

    //插入列表
    @Insert
    fun insert(beanList: List<VideoModel>)

    //查询整张表,升序排序
    @Query("SELECT * FROM video_path_table ORDER BY uid ASC")
    fun getAlphabetizedWords(): LiveData<List<VideoModel>>

    @Query("SELECT * FROM video_path_table WHERE name LIKE :name AND "+
            "image_path LIKE:imagePath LIMIT 1")
    fun findByPathNameAndImagePath(name:String,imagePath:String): VideoModel

    @Query("SELECT * FROM video_path_table WHERE video_path= :video_path ")
    fun findByPathName(video_path:String): VideoModel

    @Query("SELECT * FROM video_path_table")
    fun queryAllVideo():MutableList<VideoModel>

    @Query("DELETE FROM video_path_table WHERE name= :name ")
    fun deleteByPathName(name:String)

    @Query("DELETE FROM video_path_table ")
    fun deleteAll()

    // //查询某项的全部数据(模糊查询)
    //    @Query("SELECT * FROM 表名 WHERE 某一项 LIKE '%' || :name || '%'")
    @Query("DELETE FROM video_path_table WHERE name LIKE '%' || :name || '%'")
    fun delLikeFilePath(name:String)

    @Query("SELECT * FROM video_path_table WHERE name LIKE '%' || :name || '%'")
    fun selLikeFilePath(name:String):MutableList<VideoModel>

    //@Query("SELECT * FROM user LIMIT :limit")
    @Query("SELECT * FROM video_path_table LIMIT :limit")
    fun findLimitFile(limit:Int):MutableList<VideoModel>

    @Query("SELECT COUNT(*) FROM video_path_table")
    fun getAllVideo():Int

    //分页查询 offset代表从第几条记录“之后“开始查询,limit表明查询多少条结果
    @Query("SELECT * FROM video_path_table limit :limit offset :offset")
    fun queryPageVideo(limit:Int,offset:Int):MutableList<VideoModel>
}

5.进入主题,开始进行分页的查询

   //一次查询100条数据,pageLimit=99
    //一共480条数据,totalMusic=300
    //第一次查询 findPosition=0
    private var pageLimit=99
    private var totalMusic=0
    private var findPosition=0
    private var mainScope = MainScope()
    private var dao = AppDatabase.getDatabase().videoDao()
    private var videoList: ArrayList<VideoModel> = arrayListOf()
    private var videoListAdapter: VideoListAdapter = VideoListAdapter()
    
      onCreate(){
      ......
	  //获取数据总数
	   totalMusic = dao.getAllVideo()
	   }
......

 private fun searchList() {
        mainScope.launch(Dispatchers.IO) {
            var list: MutableList<VideoModel>
            println("----pageLimit=$pageLimit----totalMusic=$totalMusic---findPosition=$findPosition")
            if (pageLimit > totalMusic) {//总数,小于一页的查询数,全部查询
                if (videoList != null && videoList.size > 0)
                    videoList.clear()
                list = dao.queryAllVideo()
            } else {
                    if (findPosition == 0) {//第一页
                        if (videoList != null && videoList.size > 0)
                            videoList.clear()
                        list = dao.queryPageVideo(pageLimit, 0)
                    } else {
                        if (findPosition < totalMusic) {
                            list = dao.queryPageVideo(pageLimit, findPosition)
                        }else{//如果重新数据已经超出总数
                            list = dao.queryPageVideo(totalMusic-findPosition, findPosition)
                        }
                    }
                findPosition += pageLimit
            }
            withContext(Dispatchers.Main) {
                if (list != null && list.isNotEmpty()) {
                    if (videoList.size > 0) {
                        videoList.addAll(list)
                        videoListAdapter.addData(list)
                    } else {
                        videoList.addAll(list)
                        videoListAdapter.setList(videoList)
                    }
                }
            }
        }
    }
......
//在需要刷新获取下一页的地方调用
  //读取的页码数大于总数,

      if (findPosition > totalMusic) {
            Toast.makeText(context, "暂无更多数据", Toast.LENGTH_LONG).show()
         
        } else {
            searchList()
        }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐