Android Room删除SQLite文件无外键报787约束错误如何修复?
解决方案
错误码787属于SQLite外键约束违规,你贴出的Files表本身没有定义外键,问题出在项目其他表的关联配置上:其他表将Files表的FileID作为外键关联,默认的外键约束规则会禁止删除被其他表引用的主表记录,所以增查不受影响,只有删除操作触发报错。
你可以按以下步骤处理:
- 排查项目内所有Room实体类,找到带
@ForeignKey注解、且parentTable指向Files的实体,确认关联字段。 - 根据业务需求选对应处理方案:
- 如果业务需要保留关联子表记录,删除主表记录前先手动删除所有关联该
FileID的子表记录,再执行Files表的删除操作。 - 如果不需要单独保留子表记录,可以在子表的外键注解中添加
onDelete = ForeignKey.CASCADE配置,这样删除Files表记录时,关联的子表记录会被自动同步删除,示例配置如下:
- 如果业务需要保留关联子表记录,删除主表记录前先手动删除所有关联该
@Entity( tableName = "你自己的子表名", foreignKeys = @ForeignKey( entity = Files.class, parentColumns = "FileID", childColumns = "你子表里关联FileID的字段名", onDelete = ForeignKey.CASCADE ) ) public class 你的子表实体类 { // 原有实体逻辑不变 }
- 如果需要快速验证问题原因,可以临时在Room数据库构建配置中关闭外键约束,测试删除功能是否正常。仅用于测试验证,不要在线上环境关闭外键,会破坏数据一致性。
修改完外键配置后记得升级数据库版本,做对应的迁移,避免本地数据库报错。
内容的提问来源于stack exchange,提问作者svstackoverflow
相关产品推荐
相关产品推荐

