SQLite问题之部署于Android上级联更新(cascade)无反应解决方法

问题描述:

在小米真机上使用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语句。但劣势是增加了系统的复杂度和耦合度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值