Как ограничить количество строк в таблице Android SQLite
Я создаю приложение для Android, имеющее "историю повторов".
Я хотел бы ограничить размер этой таблицы максимум 50 строками (согласно их дате вставки).
Я видел несколько потоков, которые говорят об ограничении количества удаленных строк, но я не уверен, включена ли эта функция даже в Android SQLite.
Может ли кто-нибудь помочь здесь?
Спасибо
Ответы
Ответ 1
Создать триггер
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;
EDIT:
Вы можете изменить
DELETE FROM ... WHERE ... IN ...
для изображения
DELETE FROM ... WHERE ... NOT IN ...
как писал Моджо Рисин. Я не уверен, что разница в производительности для больших таблиц для использования IN
и NOT IN
, но для вашей проблемы это не имеет значения.
Ответ 2
Я думаю, что sql не может управлять количеством строк в таблице, поэтому вам придется управлять им самостоятельно. Вы можете выполнить запрос после вставки данных, который уменьшит данные - что-то вроде этого должно работать
DELETE FROM table where _id NOT IN (SELECT _id from table ORDER BY insertion_date DESC LIMIT 50)
Ответ 3
Проверьте 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);
}
}