3

我成功地使用了以下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放入原始问题中。欢迎对限制器发表评论。

4

1 回答 1

1

这种类型的触发器应该与另一种触发器一起正常工作。问题似乎是 SQL 不必要地引用了该_id字段。它为每一行选择文字字符串“_id”并将其与相同的文字字符串进行比较。

删除周围的引号'_id'(在DELETE和 sub- 中SELECT)应该可以解决问题。

于 2012-08-06T20:42:16.213 回答