Android:删除所有sqlite行不在前5

时间:2016-05-12 07:55:02

标签: java android sqlite

我的排行榜有一个数据库。目前,我将所有分数插入我的排行榜,并选择要在我的应用上显示的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 );";

我想删除该查询中的所有行。我怎么能这样做?

编辑:

我尝试了这个查询:

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

但是当我检查数据库时,仍然有很多行,所以它不起作用。

2 个答案:

答案 0 :(得分:1)

您的桌子需要一些唯一ID。用它来标识要保留的行:

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

答案 1 :(得分: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;
相关问题