¿Cómo puedo limitar el número de filas en la tabla SQLite de Android?

Creo una aplicación de Android que tiene “historia reciente”. Me gustaría limitar el tamaño de esta tabla a un máximo de 50 filas (de acuerdo con su fecha de inserción).

Vi varios hilos que hablan de limitar el número de filas eliminadas, pero no estoy seguro de si esta característica está incluso habilitada en el SQLite de Android.

¿Alguien puede ayudar aquí?

Gracias

Crear un disparador

 CREATE TRIGGER delete_till_50 INSERT ON _table WHEN (select count(*) from _table)>50 BEGIN DELETE FROM _table WHERE _table._id IN (SELECT _table._id FROM _table ORDER BY _table._id limit (select count(*) -50 from _table )); END; 

EDITAR:

Tu puedes cambiar
DELETE FROM ... WHERE ... IN ...
a
DELETE FROM ... WHERE ... NOT IN ...
como Mojo Risin escribió. No estoy seguro sobre la diferencia de rendimiento para tablas grandes para usar IN y NOT IN , pero para su problema no hay diferencia.

Creo que SQL no puede administrar el número de filas en su tabla, por lo que tendrá que administrarlo usted mismo. Puede ejecutar una consulta después de la inserción de datos que reducirá los datos, algo así debería funcionar

 DELETE FROM table where _id NOT IN (SELECT _id from table ORDER BY insertion_date DESC LIMIT 50) 

Consulte el código fuente de SearchRecentSuggestions para ver un ejemplo. Tiene un método para truncar el historial hasta un número dado de entradas, usando LIMIT -1 OFFSET . Primero debe ordenar las entradas por el orden de inserción invertido, luego omita las primeras maxEntries .

Si llama esto automáticamente cada vez que lo maxEntries + 1 , solo necesita LIMIT 1 ya que nunca puede haber más de maxEntries + 1 todos modos.

 /** * Reduces the length of the history table, to prevent it from growing too large. * * @param cr Convenience copy of the content resolver. * @param maxEntries Max entries to leave in the table. 0 means remove all entries. */ protected void truncateHistory(ContentResolver cr, int maxEntries) { if (maxEntries < 0) { throw new IllegalArgumentException(); } try { // null means "delete all". otherwise "delete but leave n newest" String selection = null; if (maxEntries > 0) { selection = "_id IN " + "(SELECT _id FROM suggestions" + " ORDER BY " + SuggestionColumns.DATE + " DESC" + " LIMIT -1 OFFSET " + String.valueOf(maxEntries) + ")"; } cr.delete(mSuggestionsUri, selection, null); } catch (RuntimeException e) { Log.e(LOG_TAG, "truncateHistory", e); } }