在android sqlite数据库中删除前N行

时间:2012-03-21 07:41:26

标签: android sqlite

请告诉我如何在android sqlite数据库中删除n行。我用了这段代码:

   String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
         "where"+KEY_ID+"in (select top 3"+ KEY_ID +"from"+ MYDATABASE_TABLE+"order by _id );";

          sqLiteDatabase.execSQL(ALTER_TBL);

但它显示错误。

03-21 13:19:39.217: INFO/Database(1616): sqlite returned: error code = 1, msg = near "in": syntax error
03-21 13:19:39.226: ERROR/Database(1616): Failure 1 (near "in": syntax error) on 0x23fed8 when preparing 'delete from detail1where_id in (select top 3_idfromdetail1order by _id );'.

7 个答案:

答案 0 :(得分:39)

String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
     " where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);";
  • 我知道sqlite中没有“top 3”命令,你必须添加一个限制
  • 在将字符串添加到一起时注意空格:"delete from" + TABLE + "where" = "delete frommytablewhere"

此方法使用两个步骤删除前N行。

  1. 找到前N行:

    SELECT id_column FROM table_name ORDER BY id_column LIMIT 3

    结果是一个id列表,代表前N行(此处为3行)。 ORDER BY部分很重要,因为SQLite不保证没有该子句的任何订单。如果没有ORDER BY,该语句可以删除3个随机行。

  2. 从表中删除与id列表匹配的任何行:

    DELETE FROM table_name WHERE id_column IN ( {Result of step 1} )

    如果步骤1的结果为空,则不会发生任何事情,如果少于N行,则会删除这些行。

    重要的是要注意id_column必须是唯一的,否则将删除超过预期的行。如果用于排序的列不唯一,则整个语句可以更改为DELETE FROM table_name WHERE unique_column IN (SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3)。提示:当在表上删除时,SQLite的ROWIDunique_column的一个很好的候选者(在删除视图时可能不起作用 - 这里不确定)。

  3. 要删除最后 N行,必须将排序顺序反转为降序(DESC):

    DELETE FROM table_name WHERE unique_column IN (
        SELECT unique_column FROM table_name ORDER BY sort_column DESC LIMIT 3
      )
    

    要删除N th 到M th 行,LIMIT子句可以由OFFSET扩展。下面的示例将跳过前两行并返回/删除下一行3.

    SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2
    

    LIMIT设置为负值(例如LIMIT -1 OFFSET 2)将返回除前2行之外的所有行,导致删除除前2行之外的所有行 - 这也可以通过转动{来完成{1}} SELECT .. WHERE .. IN ()


    SQLite有option直接在SELECT .. WHERE .. NOT IN ()语句中启用ORDER BY x LIMIT n部分而没有子查询。该选项未在Android上启用且无法激活,但在其他系统上使用SQLite的用户可能会对此感兴趣:

    DELETE

答案 1 :(得分:2)

您似乎错过了一些空间:

"where"+KEY_ID+"in..

必须是:

"where "+KEY_ID+" in...

此外,您需要使用limit语句而不是top:

答案 2 :(得分:2)

我会这样做:

db.delete(MYDATABASE_TABLE, "KEY_ID > "+ value, null);

答案 3 :(得分:2)

你可以试试这段代码

int id;

public void deleteRow(int id) { 
  myDataBase.delete(TABLE_NAME, KEY_ID + "=" + id, null);
}

String id;

public void deleteRow(String id) {  
      myDataBase.delete(TABLE_NAME, KEY_ID + "=\" " + id+"\"", null);
    }

答案 4 :(得分:1)

这是一个有点长的程序,但你可以这样做

首先获取表格的ids列,您要从中删除某些值

public Cursor KEY_IDS() {
    Cursor mCursor = db.rawQuery("SELECT KEYID " +
                                     " FROM MYDATABASE_TABLE ;", null);


            if (mCursor != null)
            {
            mCursor.moveToFirst();
            }

            return mCursor;
}

将其收集在数组列表中

ArrayList<String> first = new ArrayList<String>();

cursor1 = db.KEY_IDS();
            cursor1.moveToFirst();
            startManagingCursor(cursor1);

            for (int i = 0; i < cursor1.getCount(); i++) {

                reciv1 = cursor1.getString(cursor1
                        .getColumnIndex(DBManager.Player_Name));

second.add(reciv1);

}

和火灾删除查询

for(int i = 0 ;i<second.size(); i++)
{
db.delete(MYDATABASE_TABLE KEYID +"=" + second.get(i) , null);

}

答案 5 :(得分:1)

删除sqlite数据库中的前N(100)行

Delete from table WHERE id IN 
(SELECT id FROM table limit 100)

答案 6 :(得分:0)

您可以使用以下模式:(除了&#34; zapl&#34;提供的响应)。

**DELETE FROM {Table-X} WHERE _ID NOT IN 
 (SELECT _ID FROM {Table-X} ORDER BY _ID DESC/ASC LIMIT (SELECT {Limit-Column} FROM {SpecificationTable})  );**

其中{Table-X}指的是您要删除的表,_ID是主要的唯一列 DESC / ASC - 根据您是要删除最高记录还是最后记录,最后是在&#34; LIMIT&#34;条款,我们提供&#34; n&#34;因素使用另一个查询,该查询从{SpecificationTable}调用{Limit-Column}:其中包含您要删除它们的值。

希望这有助于某人。

快乐编码。