如何限制Android SQLite表中的行数

时间:2011-07-19 10:08:30

标签: android sqlite

我创建了一个具有“最新历史”的Android应用。 我想将此表的大小限制为最多50行(根据其插入日期)。

我看到几个讨论限制删除行数的线程,但我不确定Android的SQLite中是否启用了这个功能。

有人可以帮忙吗?

由于

3 个答案:

答案 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所写。我不确定使用INNOT 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);
    }
}