Как ограничить количество строк в таблице Android SQLite

Я создаю приложение для Android, которое имеет «историю повторов». Я хотел бы ограничить размер этой таблицы максимум до 50 строк (в соответствии с их датой вставки).

Я видел несколько потоков, которые говорят об ограничении количества удаленных строк, но я не уверен, что эта функция включена даже в SQLite от Android.

Может ли кто-нибудь помочь здесь?

благодаря

Solutions Collecting From Web of "Как ограничить количество строк в таблице Android SQLite"

Создать триггер

 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; 

РЕДАКТИРОВАТЬ:

Ты можешь измениться
DELETE FROM ... WHERE ... IN ...
в
DELETE FROM ... WHERE ... NOT IN ...
Как писал Моджо Рисин. Я не уверен в различии производительности больших таблиц для использования IN и NOT IN , но для вашей проблемы это не разница.

Я думаю, что sql не может управлять количеством строк в таблице, поэтому вам придется управлять им самостоятельно. Вы можете выполнить запрос после вставки данных, который уменьшит данные – что-то вроде этого должно работать

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

Проверьте пример исходного кода SearchRecentSuggestions . Он имеет способ обрезания истории до заданного количества записей, используя LIMIT -1 OFFSET <maxEntries> . Сначала вам нужно отсортировать записи по порядку вставки в обратном порядке, а затем пропустить первые maxEntries .

Если вы вызываете это автоматически каждый раз при вставке, вам нужно только LIMIT 1 поскольку в любом случае никогда не может быть больше maxEntries + 1 .

 /** * 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); } }