Android 从SQLite数据库中删除前8行

Android 从SQLite数据库中删除前8行,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我使用以下命令删除SQLite表中的行: public void deleteFirstRow() { SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.query("eventosUTN", null, null, null, null, null, null); if(cursor.moveToFirst()) { String rowId = cursor.get

我使用以下命令删除SQLite表中的行:

public void deleteFirstRow()
{
    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cursor = db.query("eventosUTN", null, null, null, null, null, null);

    if(cursor.moveToFirst()) {
        String rowId = cursor.getString(cursor.getColumnIndex("id"));
        db.delete("eventosUTN", "id" + "=?",  new String[]{rowId});
    }
    db.close();
}
当数据库的大小大于8行时,我需要删除前8行,因此:

public void checkRowsSize(Events events, Context contex)
{  
    new Thread(new Runnable() { 
        public void run() {
        if(events.getRowCount()>8){
            while(events.getRowCount()>8){
                events.deleteFirstRow(contex);
            }
        }
    }
}).start();
}
方法Events的getRowCount为:

public int getRowCount(){
    String query = "Select*FROM eventsUTN";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    return cursor.getCount();
} 
但是当我在checkRowSize中设置while循环时,它会删除所有数据库。为什么会这样?但如果我设定:

public void checkRowsSize(Events events, Context contex)
{  
    new Thread(new Runnable() { 
        public void run() {
        if(events.getRowCount()>8){
            events.deleteFirstRow(contex);
        }
    }
}).start();
}
它只是在每次创建活动时删除第一行,直到数据库的大小小于8行。因此,没有while循环,它工作得很好

当表的大小大于8行时,可以使用以下语句删除前8行:

delete from eventosUTN
where 
  (select count(*) from eventosUTN) > 8
  and 
  id in (select id from eventosUTN limit 8)
delete from eventosUTN 
where id < (select id from eventosUTN order by id limit 8, 1)
其中id是表的主键。 但您应该知道,您认为表中的前8行并不总是您得到的。 表行是无序的。 因此,也许您应该使用ORDERBY子句来定义此order的逻辑,如:

delete from eventosUTN
where 
  (select count(*) from eventosUTN) > 8
  and 
  id in (select id from eventosUTN order by id limit 8)
因此,您可以在java代码中这样做:

String where = "(select count(*) from eventosUTN) > 8 and id in (select id from eventosUTN order by id limit 8)";
db.delete("eventosUTN", where, null);
如果表的主键是integer,并且已定义为AUTOINCREMENT,这意味着它始终在增加且从不重用,那么您也可以使用以下语句:

delete from eventosUTN
where 
  (select count(*) from eventosUTN) > 8
  and 
  id in (select id from eventosUTN limit 8)
delete from eventosUTN 
where id < (select id from eventosUTN order by id limit 8, 1)
在java代码中:

String where = "id < (select id from eventosUTN order by id limit 8, 1)";
db.delete("eventosUTN", where, null);

如何定义第一行或前8行?您应该使用ORDERBY子句来确保。表中的行没有顺序。谢谢,在这种情况下,从1到8删除行时,新的前8行的id与以前相同吗?id是主键,它是自动递增的,当然不是。这不是主键的工作方式。主键不应更改其值。谢谢。但当我们设置select id from eventosUTN order时,id限制为8,1。它选择主键为1到8的行?还是前8排?因为当我们删除前8行时,表将再次到达8行,它将删除第一个新的8行。按id限制8从eventosUTN order中选择id,1将返回前8个最小id之后的第一行。8是偏移量,这意味着语句跳过前8行并选择其余的,但由于8后面有1,所以它只选择1行。谢谢。删除行后是否有对id进行排序的语句?因此,ID中没有间隙