问题描述:
在小米真机上使用SQLite时,级联更新(cascade
)无反应。
设备:
红米Note,Android 6.0,MIUI 10
原因:
SQLite 版本在3.6.19之前版本不支持级联更新。
解决方法:
这里有两种解决方法,各有所长,但也各有所短。
方法一:假设父表father_table的一个主键concrete_id
是子表sub_table的一个外键,某项业务逻辑为当父表删除其某项行记录时其子表对应的外键所对应的行记录也会被删除,即存在子表sub_table这样的约束语句:
FOREIGN KEY (concrete_id) REFERENCES father_table(concrete_id) ON DELETE CASCADE;
那么我们所知对应数据库不支持级联更新,但我们可以通过创建触发器来实现对应的业务逻辑,即可以存在如下触发器:
CREATE TRIGGER business_concrete_trigger sub_table BEFORE DELETE ON sub_table
FOR EACH ROW BEGIN
DELETE FROM father_table
WHERE sub_table.concrete_id = father_table.concrete_id
END;
这样做的优点是将业务逻辑捆绑于数据库,从系统底层来减少软件的复杂度和耦合度。
但如果读者不想使用触发器而是代码方式也可以。
方法二:既然是删除父表的行记录,子表的行记录也随之删除那么可以设计一个这样的业务逻辑:
定义一个这样的接口,该接口的功能是删除父表的行记录,并且随之定义一个删除子表行记录功能的接口,然后编写接口实现类使用DBHelper和SQLiteDatabase类来操纵具体的sql语句。
重点:在要实现级联更新的地方直接实例化上述过程的两个接口实现类,调用相应的重写方法传入参数即可。
这样做的优点是特别简单,就相当于根据接收的id直接执行两个删除的sql语句。但劣势是增加了系统的复杂度和耦合度。