从 SQLite 数据库中删除前 8 行

Delete the first 8 rows from an SQLite database

我删除了 SQLite table 中的行:

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();
}

每次创建 Activity 时只删除第一行,直到数据库的大小小于 8 行。所以没有 while 循环它工作正常!

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

delete from eventosUTN
where 
  (select count(*) from eventosUTN) > 8
  and 
  id in (select id from eventosUTN limit 8)

其中 id 是您 table 的 primary key
但是您应该知道,您认为 table 中的前 8 行并不总是您得到的。
Table 行未排序。
因此,也许您应该使用 ORDER BY 子句来定义此顺序的逻辑,例如:

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);


如果你的 table 的 primary keyinteger 并且被定义为 AUTOINCREMENT 这意味着它总是在增加并且从不重复使用那么你也可以使用这个语句:

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);