2016-05-12 2 views
1

У меня есть база данных для моей таблицы лидеров. В настоящее время я вставляю все оценки в свою таблицу лидеров и выбираю 5 наивысших баллов для показа в своем приложении. Я думаю, что это займет слишком много места, чтобы никогда не удалять другие баллы, поэтому я бы хотел их удалить. Как я могу это сделать?Android: удалите все строки sqlite NOT IN top 5

Вот как я выбираю топ-5 баллов, занимает первое по счету и вторым по времени, если оценка равна:

public Cursor gethmLeaderboard(SQLiteDatabase db){ 

    String[] columns = {TableInfo.LB_RANK, TableInfo.LB_SCORE, TableInfo.LB_TIME}; 

    Cursor c = db.query(TableInfo.TABLE_HM, null, null, null, null, null, TableInfo.LB_SCORE + " DESC, " + TableInfo.LB_TIME + " ASC", "5"); 
    return c; 

} 

Вот как я создаю мой стол:

public String CREATE_HMQUERY = "CREATE TABLE " + TableInfo.TABLE_HM + "(" 
     + TableInfo.LB_RANK + " INTEGER PRIMARY KEY AUTOINCREMENT DEFAULT 1 ," + TableInfo.LB_SCORE + 
     " INT,"+ TableInfo.LB_TIME + " VARCHAR);"; 

Я хочу удалите все строки НЕ В этом запросе. Как я могу это сделать?

Edit:

Я попробовал этот запрос:

public String DEL_ALLBUTES = "DELETE FROM " + 
     TableInfo.TABLE_HM + " WHERE " + 
     TableInfo.LB_RANK + " NOT IN (SELECT " + 
     TableInfo.LB_RANK + " FROM " + 
     TableInfo.TABLE_HM + " ORDER BY " + 
     TableInfo.LB_SCORE + " DESC, " + 
     TableInfo.LB_TIME + " ASC LIMIT 5);"; 

В этом формате:

db.rawQuery(DEL_ALLBUTES, null); 

Но когда я проверяю базу данных все еще есть тонны строк, чтобы он не Работа.

ответ

1

Ваш стол должен иметь уникальный идентификатор. Используйте это, чтобы определить строки, которые вы хотите сохранить:

DELETE FROM ES 
WHERE ID NOT IN (SELECT ID 
       FROM ES 
       ORDER BY Score DESC, Time ASC 
       LIMIT 5); 
+0

Я попробовал. См. Мое редактирование. Однако это не работает. – Milap

+0

Затем вы должны использовать правильное имя таблицы и уникальный идентификатор. –

+0

Извините, я переключил вещи вокруг, которые, возможно, были в замешательстве. Мое новое редактирование - это то, что я пытаюсь сделать. Он также имеет идентификатор первичного ключа. – Milap

0

Вы можете создать временную таблицу вставить верхние 5 баллов в временную таблицу и удалить все таблицы затем вставить временную таблицу в основную таблицу.

CREATE TEMP TABLE TempES AS SELECT 
    ID 
FROM 
    ES 
ORDER BY 
    Score DESC, 
    Time ASC 
LIMIT 5; 

DELETE 
FROM 
    ES; 

INSERT INTO ES SELECT 
    * 
FROM 
    TempES; 

DROP TABLE TempES; 
+0

Я попробовал. См. Мое редактирование. Однако это не работает. – Milap

+0

check Этот код. –

Смежные вопросы