我成功使用以下BEFORE INSERT触发器来限制存储在SQLite数据库表 位置中 的行数。数据库表充当Android应用程序中的缓存。
BEFORE INSERT
CREATE TRIGGER 'trigger_locations_insert' BEFORE INSERT ON 'locations' WHEN ( SELECT count(*) FROM 'locations' ) > '100' BEGIN DELETE FROM 'locations' WHERE '_id' NOT IN ( SELECT '_id' FROM 'locations' ORDER BY 'modified_at' DESC LIMIT '100' ); END
同时,我添加了第二个触发器,使我可以INSERT OR UPDATE行。-关于该主题的讨论可以在另一个主题中找到。第二个触发器需要一个VIEW在其INSERT上执行的触发器。
INSERT OR UPDATE
VIEW
INSERT
CREATE VIEW 'locations_view' AS SELECT * FROM 'locations';
由于INSERT不再在TABLE 位置 上执行,而是在VIEW locations_view 上执行,因此上述触发器不再起作用。如果我将触发器应用于VIEW以下错误消息。
TABLE
Failure 1 (cannot create BEFORE trigger on view: main.locations_view)
问题:
如何更改上述触发器以INSERT在VIEW-上观察每个触发器,或者您是否建议另一种限制行数的方法?我宁愿在数据库中处理这种操作,而不是在客户端上运行前端代码。
性能问题:
虽然,限制器(上面的触发器)总体上起作用-它的性能低于最佳效果!实际上,数据库操作花费了很长时间,因此引发了ANR。据我所看到的,其原因是,该限制器被称为 每 一个时间INSERT发生。为了优化设置,INSERT应将大宗交易包装成一个事务,然后限制器应立即执行。这可能吗?
这种触发器应与其他触发器一起正常工作。问题似乎是SQL不必要地引用了该_id字段。它为每一行选择文字字符串“ _id”,并将其与相同的文字字符串进行比较。
_id
删除引号'_id'(DELETE和子引号中SELECT)都可以解决此问题。
'_id'
DELETE
SELECT