2012-12-10 92 views
0

我有一个数据库,我不断地从服务中获取新数据。这是在一个线程中工作,所以每次我看到新数据时,我都会将ii放在数据库中。我只在我的应用程序中显示最新鲜的20条新闻,而且工作完美。问题是我想要从数据库中删除所有最旧的通知,并且只保留最新的20个通知。我不知道如何编写该查询。任何帮助?Android SQLite从行号选择和删除

+0

行号取决于顺序。您需要一个“插入日期”列并根据您的查询。 (请注意,这与android和sqlite无关,大多数sql引擎会以同样的方式工作) – njzk2

+0

当您更新以订购并删除最后添加时创建一个触发器? – adarsh

+0

订单必须降序。然后我应该选择从20到最后的所有行(通过获得行数来获得最终结果)。但也要注意,20不应该是id,它实际上是表中的行数。我不th我可以根据我的查询日期。 – Tooroop

回答

0

那么到底我是来回答我的问题:)

,我所做的事情是这样的:

if(fetchNotificationsCount() > 20){ 
     String sql = "SELECT * FROM (SELECT * FROM " + PPASQLiteHelper.TABLE_NOTIFICATIONS + " ORDER BY " + PPASQLiteHelper.COLUMN_ID + " DESC) LIMIT " + fetchNotificationsCount() + " OFFSET 20"; 
     Cursor cursor = database.rawQuery(sql, null); 
     cursor.moveToFirst(); 
     while(!cursor.isAfterLast()){ 
      database.delete(PPASQLiteHelper.TABLE_NOTIFICATIONS, PPASQLiteHelper.COLUMN_ID + "=" + cursor.getLong(0), null); 
      cursor.moveToNext(); 
     } 
     cursor.close(); 
    } 

随着LIMIT和OFFSET我能够做什么,我意。无论如何,感谢您的帮助。

+0

您正处于LIMIT和OFFSET的正确轨道,但是您的实施效率非常低,可以在一次删除呼叫中完成。您在这里展示的解决方案首先加载并遍历游标,然后根据需要多次触发“删除”。它可以完成只击中一次数据库:) – JustDanyul

+0

哦,我怎么能在一个电话中做到这一点? – Tooroop

2

根据SQLite的文档,您在“DELETE FROM”中同时具有ORDER BY和LIMIT支持。

http://www.sqlite.org/lang_delete.html

但是,我没有试过,所以如果它在安卓上SQLite的工作,我不能说。然而,是什么工作(我在过去做到了这一点)是使用

DELETE FROM tableName 
WHERE myid IN (SELECT id FROM mytable ORDER BY id LIMIT -1 OFFSET 20); 
+0

嗯...是的,我认为这也可能是一个可能的解决方案 – Tooroop

2

我喜欢@ JustDanyul的答案,但我不认为你需要在这种情况下IN条款。看起来他正在使用1个表,所以你不能写这样的查询吗?

DELETE FROM tableName ORDER BY id DESC LIMIT -1 OFFSET 20;