Android Room中如何忽略嵌入实体Address的id列?
解决方案:忽略嵌入列与视图精简列
针对你遇到的Room使用问题,我整理了具体的实现方法:
一、忽略Address表的id列(避免User表生成address_id)
你当前的代码因为在User中@Embedded了带主键id的Address实体,所以User表会自动生成address_id列。如果想避免这个情况,同时保留Address作为独立实体的完整性,可以拆分出专门用于嵌入的数据类:
// 定义仅用于嵌入的Address数据结构,不含id字段 data class AddressEmbedded( // 这里放Address的业务字段,比如street、city等,根据实际需求添加 ) // Address实体继承嵌入类,单独保留主键id @Entity(tableName = "address_table") data class Address( @PrimaryKey(autoGenerate = false) val id: Int, ) : AddressEmbedded() // User实体嵌入不含id的AddressEmbedded,而非原Address实体 @Entity(tableName = "user_table") data class User( @PrimaryKey(autoGenerate = false) val id: Int, @Embedded(prefix = "address_") val address: AddressEmbedded )
这样User表只会生成你需要的业务字段列,不会出现address_id。如果你的Address原本只有id这一个字段,那其实可以直接在User中存储关联的addressId(而非嵌入整个Address),这样更简洁。
二、创建视图时忽略不需要的外键等列
Room的视图完全支持自定义查询语句,你只需要在@DatabaseView的SQL中只选择需要的列,对应的视图数据类也只定义这些列即可:
@DatabaseView( "SELECT u.id, a.street, a.city " + "FROM user_table u " + "JOIN address_table a ON u.address_id = a.id" ) data class UserAddressView( val id: Int, val street: String, val city: String )
在这个例子中,我们没有选择外键列u.address_id,视图实体也没有定义这个字段,自然就不会包含它。无论原实体有多少列,视图都可以根据你的需求自由筛选需要的数据列,完全不受原实体结构的限制。
内容的提问来源于stack exchange,提问作者Breimer
相关产品推荐
相关产品推荐

