Room框架技术问询:能否在@Database注解中定义表名?如何通过单个Entity Model创建两张表?
嘿,针对你提出的两个Room数据库相关问题,我来给你详细解答:
问题1:是否可以在@Database注解中创建表名?
当然不行啦~ Room的表名是在**@Entity**注解里定义的,就像你代码里写的@Entity(tableName = "user_table")这样,每个实体类对应一张表,表名在这里指定。
而@Database注解的作用是标记这个类是Room数据库的核心类,它负责声明数据库包含哪些实体、数据库版本号、是否导出Schema这些全局配置,根本没法在这里设置表名。你可以把它理解成数据库的“总配置文件”,而具体的表结构和名称,都是在每个实体类的@Entity注解里单独定义的。
问题2:如何通过一个Model创建两张表?
Room默认是一个@Entity对应一张表,如果你想复用同一个数据结构生成两张不同的表,最简洁的方法是通过继承来实现,具体步骤如下:
第一步:改造原Model类
把你原来带@Entity的UserModel改成一个不带注解的基类,让它只负责定义数据结构:
// 基础数据模型,仅定义字段,不添加@Entity注解 open class BaseUserModel : Serializable { @PrimaryKey @NonNull var _id: String = "" var userName: String? = null var userAvatar: String? = null @TypeConverters(ConvertersDAO::class) var birthDate: Date? = null var gender: String? = null }
第二步:创建两个实体子类对应不同表
分别创建两个继承自BaseUserModel的子类,给每个子类添加@Entity注解并指定不同的表名:
// 对应第一张表:user_table @Entity(tableName = "user_table") class UserModel : BaseUserModel() // 对应第二张表:比如叫user_backup_table @Entity(tableName = "user_backup_table") class UserBackupModel : BaseUserModel()
第三步:更新Database类
把这两个实体类都添加到@Database的entities数组里,这样Room就会为它们分别创建两张表:
@Database(entities = [UserModel::class, UserBackupModel::class], version = 1, exportSchema = false) abstract class UserRoomDatabase : RoomDatabase() { // 原有的UserDAO,操作user_table abstract fun getUserDao() : UserDAO // 如果需要操作第二张表,可以新增对应的DAO abstract fun getUserBackupDao() : UserBackupDAO companion object{ @Volatile private var instance : UserRoomDatabase?= null fun getInstance(context : Context): UserRoomDatabase{ if(instance==null) instance = Room .databaseBuilder(context,UserRoomDatabase::class.java,"UserRoomDatabase") .build() return instance!! } } }
补充说明
如果你不想用继承,也可以直接复制一份原Model类,改个类名并指定不同的tableName,但继承的方式能减少重复代码,维护起来更方便。另外,两张表的DAO可以根据业务需求分别编写,要是操作逻辑类似,也可以写一个通用的DAO接口让两个DAO实现它。
内容的提问来源于stack exchange,提问作者Lộc Trần Phước
相关产品推荐
相关产品推荐

