Android 从SQLite数据库中删除前8行
我使用以下命令删除SQLite表中的行: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
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中没有间隙