Room
Room
持久性库在SQLite
的基础上提供了一个抽象层,让用户能够在充分利用SQLite
的强大功能的同时,获享更强健的数据库访问机制。
使用
Room
包含Database
、Entry
和Dao
三个部分。这里实现一个记录日志信息的数据库,包含一张 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>
}