实现搜索页面
前言
今天来实现一下搜索页面,使用ROOM数据库保存搜索的历史记录,根据不同加载状态展示不同布局,并使用官方的Flow layout来展示数据等操作。
先来看一下效果图,很丑~将就看一下
ROOM数据库
Room是一个数据持久化库,它是 Architecture Component的一部分。它让SQLiteDatabase的使用变得简单,大大减少了重复的代码,并且把SQL查询的检查放在了编译时。
Room数据库主要由Dao、Entity、DataBase三部分组成。
使用Room之前要导入依赖:
//jetpack room
implementation 'androidx.room:room-runtime:2.2.6'
kapt 'androidx.room:room-compiler:2.2.6'
并在build.gradle的plugins中添加以下代码:
plugins {
...
id 'kotlin-kapt'
}
Entity
在声明数据库实体类的时候需要使用@Entity来标注改实体类,主要属性如下:
- tableName 设置表名
- indices 设置索引
- primaryKeys 设置主键
- foreignKeys 设置外键
- inheritSuperIndices 父类索引是否被当前类继承
创建一个tableName为search_table的Entity,同时设置主键,注意设置主键的时候的初始值要为0:
@Entity(tableName = "search_table")
data class SearchModule(
@PrimaryKey(autoGenerate = true)//主键自增
val id:Int = 0,//主键初始值为0
@ColumnInfo(name = "time_stamp")//列名
@SerializedName("time_stamp")
val time_stamp:String,
@ColumnInfo(name = "search_content")
@SerializedName("search_content")
val search_content:String,
@ColumnInfo(name = "is_delete")
@SerializedName("is_delete")
val is_delete:Boolean = false,
@ColumnInfo(name = "create_time")
@SerializedName("create_time")
val create_time:String
)
Dao
数据访问对象,全称Data Access Objects,是Room的主要组件,负责定义访问数据库的方法,Room在编译时创建每个DAO实例。DAO抽象地以一种干净的方式去访问数据库,它可以是一个接口也可以是一个抽象类。如果它是一个抽象类,它可以有一个构造函数,它将RoomDatabase作为其唯一参数。
定义一个Dao,并实现增加,查询,删除三个方法;同时该类也要被@Dao进行注解:
@Dao
interface Dao {
@Insert
fun insert(searchModule: SearchModule):Long
@Delete
fun delete(searchList:List<SearchModule>):Int
@Query("SELECT * FROM SEARCH_TABLE WHERE is_delete ==:isDelete")
fun queryDataList(isDelete:Boolean):List<SearchModule>
}
DataBase
数据库持有者,并作为与应用持久关联数据的底层连接的主要访问点。在运行时,通databaseBuilder() 或者 inMemoryDatabaseBuilder()获取Database实例。
使用DataBase要注意以下几个地方:
- 该类必须是 abstract的
- 该类必须继承RoomDatabase
- 该类必须包含至少一个@Entity标注的类
- 该类必须包含一个被@Dao标注的类
//至少包含一个@Entity标注的类
@Database(entities = [SearchModule::class],exportSchema = false,version = 1)
abstract class SearchDataBase : RoomDatabase() {
//至少包含一个@Dao标注的类
abstract val dao:Dao
}
@Volatile
private var dbInstance: SearchDataBase? = null
val Context.db: SearchDataBase
get() {
if (dbInstance == null){
synchronized(SearchDataBase::class