Как я могу ограничить количество строк в таблице Android SQLite - PullRequest
22 голосов
/ 19 июля 2011

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

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

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

Спасибо

Ответы [ 3 ]

21 голосов
/ 19 июля 2011

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

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, но для вашей проблемы это не имеет значения.

15 голосов
/ 19 июля 2011

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

DELETE FROM table where _id NOT IN (SELECT _id from table ORDER BY insertion_date DESC LIMIT 50)
2 голосов
/ 26 ноября 2015

Посмотрите исходный код 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...