Удалить первые 8 строк из базы данных SQLite - PullRequest
0 голосов
/ 05 апреля 2020

Я удаляю строки в таблице 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();
}

Метод getRowCount для событий имеет вид:

public int getRowCount(){
    String query = "Select*FROM eventsUTN";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    return cursor.getCount();
} 

Но когда я устанавливаю значение l oop в checkRowSize, он удаляет всю базу данных. Почему это? Но если я установлю:

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

Он просто удаляет первую строку каждый раз при создании Activity, пока размер базы данных не станет меньше 8 строк. Так что без l oop все работает отлично!

1 Ответ

1 голос
/ 05 апреля 2020

Вы можете удалить первые 8 строк, если размер таблицы превышает 8 строк , с помощью этого оператора:

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

, где id - это primary key вашего Таблица. Но вы должны знать, что то, что вы считаете первыми 8 строками в таблице, не всегда то, что вы получаете. Строки таблицы неупорядочены. Поэтому, возможно, вам следует определить логи c этого порядка с помощью предложения 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 и определен как 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);
...