我成功地使用以下的 BEFORE INSERT
触发器来限制存储在 SQLite 数据库表 locations 中的行数。该数据库表在 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
同时,我添加了第二个触发器,允许我插入或更新
行 - 有关该主题的讨论可以在另一个帖子中找到。第二个触发器需要一个视图
,每个插入
都会在其上执行。
CREATE VIEW 'locations_view' AS SELECT * FROM 'locations';
由于INSERT
不再在TABLE
locations上执行,而是在VIEW
locations_view上执行,因此上面的触发器不再起作用。如果我在VIEW
上应用触发器,则会抛出以下错误消息。
Failure 1 (cannot create BEFORE trigger on view: main.locations_view)
问题:
我应该如何更改上面的触发器以观察视图上的每个INSERT
- 或者您是否建议另一种方法来限制行数?我更喜欢在数据库中处理这种操作,而不是在客户端运行前端代码。
性能问题:
尽管限制器(上述触发器)通常工作 - 它的性能却不太理想!实际上,数据库操作非常缓慢,会导致ANR错误。据我所见,原因是每次发生INSERT
都会调用限制器。为了优化设置,批量INSERT
应该被包装到一个事务中,并且限制器应该紧随其后执行。这是可能的吗?如果您愿意提供帮助,请在原问题中放置有关批量INSERT
的优化评论。欢迎在此处提出有关限制器的评论。