Room数据库使用详解
一、基础使用
-
依赖库
implementation 'androidx.room:room-runtime:2.2.5' implementation 'androidx.room:room-common:2.2.5' implementation 'androidx.room:room-ktx:2.2.5' kapt "androidx.room:room-compiler:2.2.5"//class DbUser和接口UserDao关联起来 //额外的还有rxjava2、guava的支持包
-
特性
不足:性能对比其他优秀数据库框架,并无优势;对于ORM的支持不是很好
-
常用注解
-
@Entity 修饰 数据表实体类(内部至少有一个primaryKey标记的字段)
-
@Database 数据库的抽象类
-
@Dao 用于操作数据表的Dao接口
-
@insert 新增
-
@update
-
@delete
-
@query --- sqlite
-
三部曲:
定义class
-
* 临时演示的demo的entity */ @Entity(tableName = "db_user") //room数据库的注解标记,数据表entity (tableName="db_user",indices = {@Index(value = "uname",unique = true)}) class DbUser { @PrimaryKey(autoGenerate = true) var uid = 0 @ColumnInfo(name = "uname") var name: String? = null var city: String? = null var age = 0 //如此数据表中不会有@Ignore标记的属性字段 @Ignore var isSingle = false override fun toString(): String { return "DbUser{" + "uid=" + uid + ", name='" + name + '\'' + ", city='" + city + '\'' + ", age=" + age + ", single=" + isSingle + '}' } }
-
* ---------------------------------------------------------------- * demo演示的dao接口文件 */ @Dao interface UserDao { //查询所有数据,若返回liveData则为 LiveData<List<DbUser>> @Query(value = "select * from db_user") fun getAll(): List<DbUser?>? @Query("SELECT * FROM db_user WHERE uid IN (:userIds)") fun loadAllByIds(userIds: IntArray?): List<DbUser?>? //根据uid查询 @Query( "SELECT * FROM db_user WHERE uname LIKE :name AND " + "age LIKE :age LIMIT 1" ) fun findByName(name: String?, age: Int): DbUser? @Query("select * from db_user where uid like :id") fun getUserById(id: Int): DbUser? @Insert fun insertAll(vararg users: DbUser?) //支持可变参数 @Delete fun delete(user: DbUser?) //删除指定的user @Update(onConflict = OnConflictStrategy.REPLACE) fun update(user: DbUser?) //更新,若出现冲突,则使用替换策略,还有其他策略可选择 }
-
* room数据库的dataBase抽象类 */ @Database(entities = [DbUser::class], version = 1, exportSchema = false) abstract class UserDatabase : RoomDatabase() { abstract val userDao: UserDao? companion object { const val DB_NAME = "user.db" private var instance: UserDatabase? = null @Synchronized fun getInstance(context: Context?): UserDatabase? { if (instance == null) { instance = Room.databaseBuilder( context!!, UserDatabase::class.java, DB_NAME ) .allowMainThreadQueries() //默认room不允许在主线程操作数据库,这里设置允许 .build() } return instance } } }
-
二、进阶使用
-
嵌套类
-
多表联查
-
升降级
附:注意知识点
-
entry必须非private构造函数,字段不能private
-
默认不允许主线程操作,可手动添加
allowMainThreadQueries
-
使用room结合liveData时候,返回数据可能null
-
@embeded的挂载,字段避免重复
-
创建
Dao
可以是interface,也可以abstract class ,但是抽象类的时候,所有函数都必须是抽象函数 -
AS中 java(generated)目录下,可查看插件生成的java代码。dao的操作都是事务性的。
-
外键的使用,注意索引index的优化
-
-