Room是Google推出的一款在Sqlite基础上抽象出来的数据库框架,在使用Room时可以不写繁琐的sql语句就可以完成增,删,改,查等功能。其实也有很多款三方开发者提供这种类型的数据库框架,郭霖的litepal、greenDao开发者可以自行选择。
Room主要有三个组件:
- Database:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。使用@Database注解来标识,最好为单利类方便其他类直接调用。database必须满足三个条件:
1、必须为RoomDatabase的抽象类
2、在注释中添加与数据库关联的实体列表。
3、包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。 - Dao:包含用于访问数据库的方法。
- Entity:标识数据库中的表
关系图如下:
Database 模板:
@Database(entities = [xxxxxxEntity::class],version = 1,exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun cacheChatList(): xxxxxxDao
}
-
注:其中的version是数据库版本在修改库表任何字段的时候都需要升级否则会导致在低版本升级高版本后app的crash。
-
AppDatabase为一个抽象类,推荐使用一个单利类来全局管理AppDatabase对象因为获取Database对象是成本非常高
-
AppDatabase中通过
Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build()
获取
Entity模板:
@Entity(tableName = "xxxx")
data class XXXXXXEntity(@PrimaryKey @ColumnInfo(name = "user_id") val uid: Long,
@ColumnInfo(name = "user_name") val nickName: String)
注:1、@ColumnInfo为对应的表的字段名称可省略,字段名称为entity字段名
@PrimaryKey为标识主键,每个表必须有个主键
tablename可省略如不写则表明为entity名
Dao模板:
@Dao
interface XXXXXXDao {
//增、删、改、查方法
}
注:1、dao必须是个接口
增、删、改、查、方法用法举例:
Room提供了@Update,@Delete,@Insert,而Query还是需要写sql语句的
1、@Insert:模板
insert的所有参数必须带有@entity的实体或者是实体的集合/数组
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUsers(vararg users: User)
@Insert
fun insertBothUsers(user1: User, user2: User)
@Insert
fun insertUsersAndFriends(user: User, friends: List<User>)//同时插入user和friends
}
注:1、onConflict有REPLACE、ROLLBACK(Deprecated)、ABORT、FAIL(Deprecated)、IGNORE
REPLACE:当主键和当前的数据库中的数据一样 则直接用最新的数据覆盖原有数据库中数据
ABORT:当有冲突时会终止事务(默认为此方式)
IGNORE:如果当前数据库中有和插入数据一样的主键,则插入失败,否则插入成功
2、insert可以返回一个long值,插入成功则为插入的当前行数,插入失败返回-1
如果参数为一个list返回值是list或者Long[]