Room 初探

Room

Room持久性库在SQLite的基础上提供了一个抽象层,让用户能够在充分利用SQLite的强大功能的同时,获享更强健的数据库访问机制。

使用

Room包含DatabaseEntryDao三个部分。这里实现一个记录日志信息的数据库,包含一张 LogInfo的表单。

Database

首先实现日志信息数据库。

/**
 * @author duode
 * @des 实现日志数据库
 * 参考: https://blog.csdn.net/u014620028/article/details/90719716
 * @date 2020/9/9 19:06
 *
 * exportSchema 表示是否将数据库配置导出为json文件,导出的地址在build.gradle中配置
 */
@Database(
    entities = [LogInfoTable::class],
    version = LogInfoDbConst.DB_VERSION_CODE,
    exportSchema = false
)
abstract class LogInfoDb : RoomDatabase() {

    /**
     * 用来实现单例
     * */
    private object SingleInstance {
        fun getInstance(ctx: Context): LogInfoDb {
            return Room.databaseBuilder(
                ctx.applicationContext,
                LogInfoDb::class.java,
                LogInfoDbConst.DB_NAME
            )
//          .allowMainThreadQueries()//允许主线程进行查询操作
//          .addMigrations(Migration_1_2)//配置数据库升级
                .build()
        }

    }

    companion object {
        /**
         * 暴露方法给外部调用
         * */
        fun getInstance(ctx: Context): LogInfoDb {
            return SingleInstance.getInstance(ctx)
        }
    }

    /**
     * 返回日志信息表的操作dao层
     * */
    abstract fun logInfoDao(): LogInfoDao

}

Entry

实现日志信息表。

/**
 * @author duode
 * @des 日志信息表;
 * 数据的表单以table结尾,用来和服务器数据(以bean结尾)以及仅本地数据使用(以data结尾)作区分
 * @date 2020/9/9 19:16
 *
 * @param id 用来作为唯一键
 * @see LogInfoData
 */
@Entity(tableName = LogInfoDbConst.TABLE_NAME_LOG_INFO)
data class LogInfoTable(@PrimaryKey(autoGenerate = true)
                        @ColumnInfo(name = "_id", index = true)
                        var id: Long,
                        @ColumnInfo(name = "flag")
                        var flag: Int,
                        var globalTag: String,
                        var selfTag: String,
                        var msg: String,
                        var logLevel: Int,
                        var fileName: String,
                        var className: String,
                        var methodName: String,
                        var threadName: String,
                        var logPosition: String,
                        var mills: Long) {

  /**
   * _id默认值给0,表示数据库中不存在
   * */
  constructor(flag: Int,
              globalTag: String,
              selfTag: String,
              msg: String,
              logLevel: Int,
              fileName: String,
              className: String,
              methodName: String,
              threadName: String,
              logPosition: String,
              mills: Long) : this(0, flag, globalTag, selfTag, msg, logLevel, fileName, className, methodName, threadName, logPosition, mills)
}

Dao

实现 Dao层,用来操作日志信息表单。

/**
 * @author duode
 * @des 用来操作日志信息表
 * @date 2020/9/10 10:01
 *
 */
@Dao
interface LogInfoDao : IBaseDao<LogInfoTable> {

    /**
     * @return 查询所有日志,以 mills 进行倒序
     * */
    @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} order by mills desc")
    suspend fun queryAll(): MutableList<LogInfoTable>

    @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} where _id in (:ids) order by _id")
    fun queryListById(vararg ids: Long): Flow<MutableList<LogInfoTable>>

    /**
     * @param num 限制需要查询的条数
     * */
    @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} where globalTag is :globalTag order by _id limit :num")
    suspend fun queryListByTag(globalTag: String, num: Int): MutableList<LogInfoTable>

    /**
     * @return 查询 指定 globalTag 和 selfTag 的日志,以 mills 进行倒序
     * */
    @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} where globalTag is :globalTag AND selfTag like :selfTag order by mills desc")
//    fun queryListByTag(globalTag: String, selfTag: String): LiveData<MutableList<LogInfoTable>>
    suspend fun queryListByTag(globalTag: String, selfTag: String): MutableList<LogInfoTable>

    /**
     * @param classNameSuffix 类名的后缀,一般是不含包名的简单类名;需要在前面添加通配符 %
     *
     * @return 查询 指定 className 的日志,以 mills 进行倒序
     * */
    @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} where className like :classNameSuffix order by mills desc")
    suspend fun queryListByClassName(classNameSuffix: String): MutableList<LogInfoTable>

    /**
     * @return 查询 指定 fileName 的日志,以 mills 进行倒序
     * */
    @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} where fileName == :fileName order by mills desc")
    suspend fun queryListByFileName(fileName: String): MutableList<LogInfoTable>


    /**
     * 将配置信息中的 所有参数都写上,这样即可以满足所有的组合条件
     * @return 返回指定条件的数据 以 mills 进行倒序
     * */
    @Query(
        value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} where flag like :queryFlag and globalTag like :queryGlobalTag " +
                "and selfTag like :querySelfTag and fileName like :queryFileName and className like :queryClassName  and methodName like :queryMethodName order by mills desc"
    )
    suspend fun queryList(
        queryFlag: String,
        queryGlobalTag: String,
        querySelfTag: String,
        queryFileName: String,
        queryClassName: String,
        queryMethodName: String
    ): MutableList<LogInfoTable>

    /**
     * 删除所有数据
     * @return 返回删除的行数
     */
    @Query("DELETE FROM ${LogInfoDbConst.TABLE_NAME_LOG_INFO}")
    suspend fun deleteAll(): Int

    @Query("DELETE FROM ${LogInfoDbConst.TABLE_NAME_LOG_INFO} WHERE selfTag IS :selfTag")
    suspend fun deleteByTag(selfTag: String): Int

    /**
     * 删除 指定 className 的日志,以 mills 进行倒序
     * @param classNameSuffix 类名的后缀,一般是不含包名的简单类名;需要在前面添加通配符 %
     * @return 删除的行数
     * */
    @Query("DELETE FROM ${LogInfoDbConst.TABLE_NAME_LOG_INFO} WHERE className like :classNameSuffix")
    suspend fun deleteByClassName(classNameSuffix: String): Int

    /**
     * @return 查询 指定 fileName 的日志,以 mills 进行倒序
     *
     * fixme: 2020-12-10 如果传递参数来确认 group,会只能查询到一个数据
     * */
//   @Query(value = "select * from ${LogInfoDbConst.TABLE_NAME_LOG_INFO} group by :itemName")
//    suspend fun queryGroupByName(itemName: String): MutableList<LogInfoTable>
    @Query(value = "SELECT * FROM ${LogInfoDbConst.TABLE_NAME_LOG_INFO} GROUP BY selfTag")
    suspend fun querySelfGroup(): MutableList<LogInfoTable>

    /**
     * 查询出所有条件的情况
     * */
    @Query(value = "SELECT * FROM ${LogInfoDbConst.TABLE_NAME_LOG_INFO} GROUP BY flag,globalTag,selfTag,logLevel,fileName,className,threadName")
    suspend fun queryGroup(): MutableList<LogInfoTable>


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值