Android compose wanandroid app之搜索页面实现

本文介绍了如何使用ROOM数据库在搜索页面实现数据持久化,包括Entity Dao及ViewModel的操作,配合官方FlowLayout展示搜索历史记录,并处理加载状态和数据展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

今天来实现一下搜索页面,使用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值