我创建了一个具有“最新历史”的Android应用。 我想将此表的大小限制为最多50行(根据其插入日期)。
我看到几个讨论限制删除行数的线程,但我不确定Android的SQLite中是否启用了这个功能。
有人可以帮忙吗?
由于
答案 0 :(得分:21)
创建触发器
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 ...
正如Mojo Risin所写。我不确定使用IN
和NOT IN
的大型表的性能差异,但对于您的问题,它没有区别。
答案 1 :(得分:15)
我认为sql无法管理表中的行数,因此您必须自己管理它。您可以在数据插入后执行查询,这将减少数据 - 这样的事情应该起作用
DELETE FROM table where _id NOT IN (SELECT _id from table ORDER BY insertion_date DESC LIMIT 50)
答案 2 :(得分:2)
查看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);
}
}