Android Room中外键onDelete的set_default用法及子行默认值设置疑问
Android Room外键中
SET_DEFAULT的用法全解析 嘿,我来帮你把Room里外键SET_DEFAULT的用法说透,包括它的作用、默认值该设在哪,还有实际代码怎么写,咱们一步步来。
首先,SET_DEFAULT到底是干啥的?
当你给子表的外键设置onDelete = ForeignKey.SET_DEFAULT时,父表中被引用的行被删除后,子表中对应行的外键字段会自动被设置为你预先定义好的默认值。
比如你有个Category(分类)父表,和Product(产品)子表,产品关联分类。如果某个分类被删除,你想让属于这个分类的产品自动归到“默认分类”,那SET_DEFAULT就派上用场了。
关键:默认值该设置在何处?
默认值不是在外键注解里设的,而是要在子实体的外键字段上用@ColumnInfo(defaultValue = "...")来指定。这里要注意两个细节:
defaultValue的参数是字符串类型,哪怕你的字段是整数,也要用引号包起来(比如defaultValue = "1")- 默认值必须满足外键的约束要求:也就是这个默认值必须对应父表中存在的行ID,否则数据库会抛出约束错误(除非你允许外键为null,但那不如直接用
SET_NULL了)
实际代码示例
咱们用分类和产品的例子来写具体代码:
1. 定义父实体(Category)
@Entity(tableName = "categories") data class Category( @PrimaryKey(autoGenerate = true) val id: Int = 0, val name: String )
假设咱们预先在这个表里插入一个默认分类,比如id=1,name="默认分类"。
2. 定义子实体(Product)
这里重点看外键字段categoryId的设置:
@Entity( tableName = "products", foreignKeys = [ ForeignKey( entity = Category::class, parentColumns = ["id"], childColumns = ["category_id"], onDelete = ForeignKey.SET_DEFAULT // 当父行删除时,子行外键设为默认值 ) ] ) data class Product( @PrimaryKey(autoGenerate = true) val id: Int = 0, val name: String, // 这里设置外键字段的默认值为1,对应默认分类的id @ColumnInfo(name = "category_id", defaultValue = "1") val categoryId: Int )
验证效果
当你删除Category表中id=2的分类时,Product表中所有category_id=2的行,它们的category_id会自动被更新为1(也就是咱们设置的默认值),完美实现“产品归到默认分类”的需求。
注意事项
- 确保父表中存在默认值对应的行:比如上面的例子,你得先往
categories表插入id=1的默认分类,否则删除父行时会触发外键约束错误。 - 如果你的外键字段允许为null,也可以把默认值设为
"null",但这种情况其实和SET_NULL效果一致,没必要多此一举。 SET_DEFAULT只在父行被删除时触发,父行更新时不会影响子行(如果要处理更新,可以设置onUpdate参数)。
内容的提问来源于stack exchange,提问作者Сергей Загоруйко
相关产品推荐
相关产品推荐

