android room数据库的使用和分页查询
android room数据库的使用和分页查询
·
本章内容:项目引入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()
}
更多推荐
已为社区贡献6条内容
所有评论(0)