我成功地使用了以下BEFORE INSERT
触发器来限制存储在 SQLite 数据库表位置中的行数。数据库表在 Android 应用程序中充当缓存。
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
。
CREATE VIEW 'locations_view' AS SELECT * FROM 'locations';
由于 anINSERT
不再在位置上执行,而是在TABLE
locations_view上执行,因此上述触发器不再起作用。如果我在以下错误消息上应用触发器,则会引发以下错误消息。VIEW
VIEW
Failure 1 (cannot create BEFORE trigger on view: main.locations_view)
问题:
如何更改上述触发器以观察每个触发器INSERT
-VIEW
或者您是否推荐另一种限制行数的方法?我更愿意在数据库中处理这种操作,而不是在我的客户端上运行前端代码。
性能问题:
虽然,限制器(上述触发器)通常工作 - 它的性能不如最佳!实际上,数据库操作需要很长时间,以至于引发了 ANR。据我所知,原因是每次发生时都会调用限制器INSERT
。为了优化设置,批量INSERT
应该被包装到一个事务中,并且限制器应该在之后执行。这可能吗?如果您愿意提供帮助,请将有关批量的优化评论INSERT
放入原始问题中。欢迎对限制器发表评论。