2012-03-21 27 views
13

Por favor, hágame saber cómo eliminar n-rows en la base de datos de android sqlite. Utilicé este código:Eliminar las primeras N filas en la base de datos sqlite de Android

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

Pero muestra un error.

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

no se puede utilizar eliminar comunicado con instrucción de selección en la única consulta. – Lucifer

+0

@Lucifer realmente puedes. Pero no puedes poner una eliminación dentro de una selección. vea http://www.sqlite.org/lang_expr.html la expresión es la parte que puede poner después de "dónde" – zapl

Respuesta

36
String ALTER_TBL ="delete from " + MYDATABASE_TABLE + 
    " where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);"; 
  • No hay un comando "top 3" en sqlite yo sepa, hay que añadir un límite
  • cuidado con los espacios cuando se agrega cadenas juntas: "delete from" + TABLE + "where" = "delete frommytablewhere"

Este enfoque utiliza dos pasos para eliminar las primeras N filas.

  1. encontrar las primeras N filas:

    SELECT id_column FROM table_name ORDER BY id_column LIMIT 3

    El resultado es una lista de identificadores que representan la primera N (aquí): 3 filas. La parte ORDER BY es importante ya que SQLite no garantiza ninguna orden sin esa cláusula. Sin ORDER BY, la instrucción podría eliminar 3 filas aleatorias.

  2. Eliminar cualquier fila de la tabla que coincide con la lista de identificadores:

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

    Si el resultado del paso 1 es vacía, no sucederá nada, si hay menos de N filas sólo estos serán borrado

    Es importante tener en cuenta que el id_column tiene que ser exclusivo, de lo contrario, se eliminarán más de las filas previstas. En caso de que la columna que se utiliza para ordenar no sea única, toda la declaración se puede cambiar a DELETE FROM table_name WHERE unique_column IN (SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3). Sugerencia: SQLite ROWID es un buen candidato para unique_column al eliminar en las tablas (puede no funcionar al eliminar en las vistas, no estoy seguro aquí).

Para eliminar los últimos N filas el orden de clasificación se ha revertido a descendente (DESC):

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

Para eliminar la N º a M º fila del LIMIT cláusula puede ser extendida por un OFFSET. Ejemplo a continuación saltaría las 2 primeras filas y volver/eliminar la siguiente 3.

SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2 

Ajuste de la LIMIT a un valor negativo (por ejemplo,LIMIT -1 OFFSET 2) devolverá todas las filas, además de la primera 2 resulta en la eliminación de todo, pero las 2 primeras filas - que también podría llevarse a cabo girando el SELECT .. WHERE .. IN() en SELECT .. WHERE .. NOT IN()


SQLite tiene una option para permitir que la parte ORDER BY x LIMIT n directamente la declaración DELETE sin una sub consulta. Esa opción se no está activado en Android y no puede ser activado, pero esto podría ser de interés para las personas que utilizan SQLite en otros sistemas:

DELETE FROM table_name ORDER BY sort_column LIMIT 3 
+0

03-21 13: 26: 33.716: INFO/Base de datos (1647): sqlite devuelto: código de error = 1 , msg = cerca de "_id": error de sintaxis 03-21 13: 26: 33.737: ERROR/Base de datos (1647): error 1 (cerca de "_id": error de sintaxis) en 0xd5cd0 al preparar "eliminar del detalle1 donde _id in (seleccione _id de detail1order por _id LIMIT 3); '. – user933909

+0

agrega el espacio faltante antes de 'order'. Tiene "detail1order" – zapl

+0

genial ... Gracias funciona – user933909

2

Parece que te has perdido algunos espacios:

"where"+KEY_ID+"in.. 

debe ser:

"where "+KEY_ID+" in... 

Además es necesario utilizar la declaración limit en lugar de arriba:

2

que haré:

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

se puede probar este código

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

Es un procedimiento poco largo pero puede hacerlo de esta manera

primero obtener columna de los ID de tabla de la que la que desea eliminar ciertos valores

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


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

      return mCursor; 
} 

recogerla en una lista de arreglo

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

} 

y el fuego consulta de eliminación

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

} 
0

Puede hacer uso del siguiente modo: (además de la respuesta proporcionada por "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}) );** 

Donde {tabla-X} se refiere a la tabla que desea eliminar, _ID es la principal columna única DESC/ASC - En función de si desea eliminar los registros superiores o los últimos registros, y finalmente en la cláusula "LIMIT", proporcionamos el factor "n" usando otra consulta, que invoca el {Limit-Column} de {SpecificationTable}: que contiene el valor con el que desea eliminarlos.

Espero que esto ayude a alguien.

Happy Coding.

0

borrar primero N (100) filas en la base de datos SQLite

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