@Entity
:使用Room定义一个数据实体User(带Entity注解的类),一个Entity表由主键和一个或多个列组成,User中的每个实例都代表着User表中的一行,tableName后面为表名,在不指定表名的情况下,默认将类名作为数据表的名称。
@ColumnInfo
:Room默认使用字段名称作为列名称,如需更改,采用@ColumnInfo注解设置name属性(列名)。
@ColumnInfo(name = "user_name",typeAffinity = ColumnInfo.TEXT,defaultValue = "默认值")
@Ignore
:表示会忽略这个字段,不进行记录
@PrimaryKey
:每一个实体类都需要一个唯一的标识即主键。
@NonNull
:该字段不可为空
@Embedded
:实体类中引用其它实体类
Room 不允许对象引用,通过@TypeConverter
自定义类型转换器
@Embedded——引用其它实体类
:假如实体类中包含了多个同一类型的嵌入字段(比如一个人User拥有两本Book),我们可以通过设置prefix属性来保持每列的唯一性。Room会将提供的值添加到嵌入对象的每个列名的开头。
//@Embedded(prefix = "one"),这个是区分唯一性的,
//比如说一这个人有2本书并添加了tag,那么在数据表中就会以prefix+属性值命名
@Embedded(prefix = "one")
private Book address;
@Embedded(prefix = "two")
private Book address;
@Dao
: 使用@Dao注解定义为一个BaseDao接口,增加基本的插入、删除、修改方法,再定义一个UserDao去扩展BaseDao接口,增加需要的方法。
@Insert
:插入,可以定义将其参数插入数据库中的相应表的方法
OnConflictStrategy.REPLACE:冲突策略是取代旧数据同时继续事务
OnConflictStrategy.ROLLBACK:冲突策略是回滚事务
OnConflictStrategy.ABORT:冲突策略是终止事务
OnConflictStrategy.FAIL:冲突策略是事务失败
OnConflictStrategy.IGNORE:冲突策略是忽略冲突
最新代码中ROLLBACK 和 FAIL 已经deprecated了,使用ABORT替代
@Delete
:删除,可以定义用于从数据库表中删除特定行的方法
@Update
:修改,可以定义用于更新数据库表中特定行的方法
@Query
: 查询,可以从应用的数据库查询指定数据,用于更加复杂的插入、删除、更新操作
@DataBase
:定义用户保存数据库的MyDataBase类,定义数据库配置。
@exportSchema
:是否导出数据库表,默认true
如果不指定,需要将exportSchema = false,或者在app的build.gradle里设置对应的路径,否则会出现如下报错
Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.
//指定room.schemaLocation生成的文件路径, java环境(两者选一,看项目环境)
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
//指定room.schemaLocation生成的文件路径, kotlin环境 (两者选一,看项目环境)
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
@Database(entities = {User.class, Book.class}, version = 2,exportSchema = false)
@DeleteTable
:删除数据表
DROP TABLE user_table
@RenameTable
: 重命名数据表
database.execSQL("RENAME TABLE user_table to new_table_name");
@DeleteColumn
:删除数据表中的列
database.execSQL("ALTER TABLE user_table ADD COLUMN job TEXT");
@RenameColumn
:重命名数据表中的列
database.execSQL("ALTER TABLE user_table RENAME COLUMN job TO user_job");