我如何限制Android SQLite表中的行数

我创build了一个具有“最近历史”的Android应用程序。 我想限制这个表的大小最多50行(根据他们的插入date)。

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

任何人都可以帮忙吗?

谢谢

Solutions Collecting From Web of "我如何限制Android SQLite表中的行数"

创build一个触发器

 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大型表的性能差异,但对于你的问题,这是没有区别的。

我认为SQL不能pipe理你的表中的行数,所以你将不得不自己pipe理它。 你可以在数据插入后执行查询,这会减less数据 – 这样的事情应该工作

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

查看SearchRecentSuggestions的源代码的例子。 它有一个截断历史到给定数目的条目的方法,使用LIMIT -1 OFFSET <maxEntries> 。 您必须先按照相反的插入顺序sorting条目,然后跳过第一个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); } }