Android Studio Room 中如何使用同一个Model类定义两张数据表
结论
Room 不支持单个实体类对应绑定两张不同的数据表,@Entity 注解的 tableName 属性是和类唯一绑定的,无法动态修改同一个类对应的表名。
可行实现方案
方案1:基类字段复用,子类分别绑定不同表(最推荐)
因为两张表的字段结构完全一致,你可以把通用字段抽到开放的基类中,两个子类分别添加@Entity注解绑定各自的表名即可,原有逻辑不需要大改:
- 定义通用字段基类
open class BaseArticles( open val id: Int, open val author: String, open val date: String, open val img: String, open val source: String, open val title: String, open val url: String, open val interest: String )
- 首页缓存表实体类
@Entity(tableName = "articles_table") data class ArticlesCache( @PrimaryKey(autoGenerate = true) override val id: Int, override val author: String, override val date: String, override val img: String, override val source: String, override val title: String, override val url: String, override val interest: String ) : BaseArticles(id, author, date, img, source, title, url, interest)
- 收藏表实体类
@Entity(tableName = "articles_bookmark_table") data class ArticlesBookmark( @PrimaryKey(autoGenerate = true) override val id: Int, override val author: String, override val date: String, override val img: String, override val source: String, override val title: String, override val url: String, override val interest: String ) : BaseArticles(id, author, date, img, source, title, url, interest)
后续你只需要分别为两个实体类编写对应的DAO即可操作两张表,数据可以在两个实体类之间通过基类属性快速转换,不需要重复写字段定义。
方案2:单表加字段区分(无强制分表要求可选)
如果你没有硬性要求必须拆成两张表,也可以保留单一实体类,新增字段区分数据类型,代码量最少:
@Entity(tableName = "articles_all_table") data class Articles( @PrimaryKey(autoGenerate = true) val id: Int, val author: String, val date: String, val img: String, val source: String, val title: String, val url: String, val interest:String, // 1=首页缓存数据,2=用户收藏数据 val dataType: Int )
后续查询的时候只需要携带dataType条件就能分别获取缓存和收藏的新闻,不需要维护两张表,缺点是数据耦合,批量清理首页缓存时存在误操作收藏数据的风险。
内容的提问来源于stack exchange,提问作者user15608723
相关产品推荐
相关产品推荐

