trigger transact example ejemplo create commands android sql sqlite triggers database-trigger

android - transact - trigger sqlite ejemplo



SQLite: ¿Cómo limitar el número de filas según la marca de tiempo? (1)

Utilicé con éxito el siguiente desencadenante BEFORE INSERT para limitar el número de filas almacenadas en las ubicaciones de la tabla de la base de datos SQLite. La tabla de la base de datos actúa como un caché en una aplicación de 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

Mientras tanto, agregué un segundo disparador que me permite INSERT OR UPDATE filas. - La discusión sobre ese tema se puede encontrar en otro hilo . El segundo activador requiere una VIEW en la que se ejecuta cada INSERT .

CREATE VIEW ''locations_view'' AS SELECT * FROM ''locations'';

Como un INSERT ya no se ejecuta en las ubicaciones TABLE pero en la vista VIEW locations_ , el desencadenante anterior ya no funciona. Si aplico el disparador en la vista, se lanza el siguiente mensaje de error.

Failure 1 (cannot create BEFORE trigger on view: main.locations_view)

Pregunta:

¿Cómo puedo cambiar el disparador anterior para observar cada INSERT en la VIEW ? ¿O me recomiendan otra forma de limitar el número de filas? Preferiría manejar este tipo de operación dentro de la base de datos, en lugar de ejecutar código frontend en mi cliente.

Problemas de desempeño:

Aunque, el limitador (el disparador anterior) funciona en general: ¡funciona menos que lo óptimo! En realidad, las acciones de la base de datos tardan tanto que se genera un ANR. Por lo que puedo ver, la razón es que se llama al limitador cada vez que ocurre un INSERT . Para optimizar la configuración, el INSERT granel debe ser envuelto en una transacción y el limitador debe funcionar inmediatamente después. es posible? Si desea ayudar, haga los comentarios de optimización sobre INSERT granel en la pregunta original . Los comentarios sobre el limitador son bienvenidos aquí.


Este tipo de disparador debería funcionar bien junto con el otro. El problema parece ser que el SQL cita innecesariamente el campo _id . Está seleccionando la cadena literal "_id" para cada fila y comparándola con la misma cadena literal.

Quitar las comillas alrededor de ''_id'' (tanto en el DELETE como en el sub SELECT ) debería solucionar el problema.