我以此删除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行时,我需要删除firts 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)
其中id
是表格的primary key
。但是您应该知道,表中的前8行并不总是您所得到的。表行是无序的。因此,也许您应该使用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);
如果表的primary key
是integer
并已定义为AITOINCREMENT
,这意味着它一直在增加并且从不重用,那么您也可以使用以下语句:
delete from tablename
where id < (select id from tablename order by id limit 8, 1)
和Java代码:
String where = "id < (select id from tablename order by id limit 8, 1)";
db.delete("eventosUTN", where, null);