2012-03-21 93 views
13

請讓我知道如何刪除android sqlite數據庫中的n行。我用這個代碼:刪除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);'. 
+0

您不能使用delete語句在單個查詢select語句。 – Lucifer 2012-03-21 07:48:46

+0

@Lucifer其實你可以。但是你不能在選擇內部進行刪除。請參閱http://www.sqlite.org/lang_expr.html表達式是您可以放在「where」之後的部分。 – zapl 2012-03-21 08:14:36

回答

36
String ALTER_TBL ="delete from " + MYDATABASE_TABLE + 
    " where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);"; 
  • 有SQLite中沒有「前3名」命令,我知道的,你必須添加一個極限
  • 注意空格,當您添加字符串連接在一起:"delete from" + TABLE + "where" = "delete frommytablewhere"

該方法使用兩個步驟刪除前N行。

  1. 查找所述第一N行:

    SELECT id_column FROM table_name ORDER BY id_column LIMIT 3

    結果是表示第一N ID的列表(此處: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的好選擇(在視圖上刪除時可能不起作用 - 這裏不確定)。

要刪除最後 N行的排序順序必須被反轉以降序(DESC):

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

要刪除的N個至M LIMIT子句可以擴展OFFSET。下面的實施例將跳過該第一2行和返回/刪除下一3.

SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2 

設置LIMIT爲負值(例如LIMIT -1 OFFSET 2)將返回所有行除了前2導致的一切,但前兩排的缺失 - 這也可以通過直接在轉動SELECT .. WHERE .. IN()SELECT .. WHERE .. NOT IN()


的SQLite有option,使ORDER BY x LIMIT n部分完成DELETE聲明沒有子查詢。該選項沒有在Android啓用,並且不能被激活,但是這可能會感興趣的使用在其他系統上的SQLite人:

DELETE FROM table_name ORDER BY sort_column LIMIT 3 
+0

03-21 13:26:33.716:INFO/Database(1647):sqlite返回:錯誤代碼= 1 ,msg = near「_id」:語法錯誤 03-21 13:26:33.737:錯誤/數據庫(1647):在準備'從detail1刪除_id in(_id「時出現語法錯誤)0xd5cd0通過_id LIMIT 3);從'detail1order'中選擇_id。 – user933909 2012-03-21 07:58:06

+0

在'訂單'前添加缺少的空格。您有「detail1order」 – zapl 2012-03-21 08:01:10

+0

太棒了......感謝它的工作原理 – user933909 2012-03-21 08:04:50

2

看來,你已經錯過了一些空間:

"where"+KEY_ID+"in.. 

必須是:

"where "+KEY_ID+" in... 

此外,你需要使用limit聲明,而不是頂部:

2

我會做到:

db.delete(MYDATABASE_TABLE, "KEY_ID > "+ value, null); 
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); 
    } 
1

這是一個有點長的過程,但你可以做這樣的

首先從其中要刪除某個值

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


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

      return mCursor; 
} 

其收集在表的ID列陣列列表

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

} 

and the fire delete query

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

} 
0

您可以使用以下模式:(除了由「zapl」提供的響應)。

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

其中{表-X}指的是要刪除的表,_ID是主獨柱 DESC/ASC - 根據您是否要刪除上方的記錄或最後一個記錄,最後在「LIMIT」子句中,我們使用另一個查詢來提供「n」因子,該查詢從{SpecificationTable}中調用{Limit-Column}:其中包含要刪除它們的值。

希望這有助於某人。

快樂編碼。

0

刪除第N(100)排在SQLite數據庫

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