Jetpack系列之Room 数据库
创始人
2025-06-01 05:03:19

(一)概述 

Room:准确的说,Room是Jetpack 基于Sqlite开发的数据库组件,好处就是基于简单的注释来实现Sqlite中的许多繁琐的定义和操作,同时也可结合LiveData消息订阅数据变更。

(二)代码实现

step 1:添加 Room 依赖

plugins {...id 'kotlin-kapt'
}android {...defaultConfig {...javaCompileOptions {annotationProcessorOptions {arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]}}}...
}dependencies {...// Room DB libsimplementation "androidx.room:room-runtime:$room_version"implementation "androidx.room:room-ktx:$room_version"// 由于 Room 会根据我们在项目中声明的注解来动态生成代码,// 因此这里要使用 kapt 引入 Room 的编译时注解库.kapt "androidx.room:room-compiler:$room_version"androidTestImplementation "androidx.room:room-testing:$room_version"
}

step 2:定义数据表

@Entity(tableName = "cache")
class Cache : Serializable {//PrimaryKey 必须要有,且不为空,autoGenerate 主键的值是否由Room自动生成,默认false@PrimaryKeyvar key: String = ""@ColumnInfo(name = "data")// 指定该字段在表中列的名字(可以不写)var data: ByteArray? = null
}

step 3:定义数据库

@Database(entities = [Cache::class], version = 1, exportSchema = true)
abstract class CacheDatabase : RoomDatabase() {abstract fun getCacheDao(): CacheDao
}

 step 4:定义数据库crud操作

@Dao
interface CacheDao {@Insert(onConflict = OnConflictStrategy.REPLACE)fun save(cache: Cache): Long/*** 由于字段key和方法的参数key重名,所以用`key`, 注意不是单引号''** 注意,冒号后面必须紧跟参数名,中间不能有空格。大于小于号和冒号中间是有空格的。* select *from cache where【表中列名】 =:【参数名】------>等于* where 【表中列名】 < :【参数名】 小于* where 【表中列名】 between :【参数名1】 and :【参数2】------->这个区间* where 【表中列名】like :参数名----->模糊查询* where 【表中列名】 in (:【参数名集合】)---->查询符合集合内指定字段值的记录*/@Query("select * from cache where `key` = :key")fun getCache(key: String): Cache?// 只能传递对象, 删除时根据Cache中的主键 来比对的@Deletefun delete(cache: Cache): Int@Update(onConflict = OnConflictStrategy.REPLACE)fun update(cache: Cache): Int@Query("select * from cache")fun getAll(): List?
}

step 5:建立数据库,对外提供操作接口

object DbManager {private var database: CacheDatabaseinit {// 创建内存数据库,进程被杀数据将丢失// Room.inMemoryDatabaseBuilder()database = Room.databaseBuilder(AppGlobals.getApplication(),CacheDatabase::class.java,"cache_db")// 允许主线程进行查询.allowMainThreadQueries()// 数据库创建和打开到回调// .addCallback()// 设置查询线程池//.setQueryExecutor()//room的日志模式//.setJournalMode()//数据库升级异常之后的回滚//.fallbackToDestructiveMigration()//数据库升级异常后根据指定版本进行回滚//.fallbackToDestructiveMigrationFrom()//数据库升级1->2;如果要跨版本升级,则需要定义多个Migration_X_Y并用逗号隔开。/*.addMigrations(Migration_1_2(1, 2) {it.execSQL("alter table teacher rename to student")it.execSQL("alter table teacher add column teacher_age INTEGER NOT NULL default 0")})*/.build()}fun getCacheDao(): CacheDao {return database.getCacheDao()}
}

具体举例:DbManager.getCacheDao().save(cache)

(三)注意事项

注意:@Insert(onConflict = OnConflictStrategy.REPLACE) 注解, 如果指定 id 的对象没有保存在数据库中, 就会新增一条数据到数据库。如果指定 id 的对象数据已经保存到数据库中, 就会删除掉原来的数据, 然后新增一条数据。id将自增,但数据库的条数不变,只是替换了一条数据内容而已。

相关内容

热门资讯

最新消息“ 同城跑胡子 是不是... 您好:同城跑胡子这款游戏可以开挂,确实是有挂的,需要软件加微信【3398215】很多玩家在这款游戏中...
实测分享“永和备厅牛牛能开透视... 您好:永和备厅牛牛这款游戏可以开挂,确实是有挂的,需要软件加微信【6355786】,很多玩家在永和备...
重大来袭“阿当比鸡到底是有挂吗... 您好:阿当比鸡这款游戏可以开挂,确实是有挂的,需要了解加客服微信【6670747】很多玩家在这款游戏...
&lt;玩家推荐>... 您好:喜扣这款游戏可以开挂,确实是有挂的,需要软件加微信【5991307】,很多玩家在喜扣这款游戏中...
玩家必看“心悦龙江麻将可以开挂... 您好:心悦龙江麻将这款游戏可以开挂,确实是有挂的,需要软件加微信【69174242】,很多玩家在心悦...