Удалить первые N строк в базе данных Android Qulite - PullRequest
14 голосов
/ 21 марта 2012

Пожалуйста, дайте мне знать, как удалить n-строк в базе данных Android sqlite. Я использовал этот код:

   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 ]

40 голосов
/ 21 марта 2012
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

    Результатом является список идентификаторов, которые представляют первые N (здесь: 3) строк.Часть ORDER BY важна, поскольку SQLite не гарантирует порядок без этого условия.Без ORDER BY оператор может удалить 3 случайные строки.

  2. Удалить любую строку из таблицы, которая соответствует списку идентификаторов:

    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 ROWID является хорошим кандидатом для unique_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 th в M th строка Предложение LIMIT может быть расширено на OFFSET.Пример ниже пропустит первые 2 строки и вернет / удалит следующие 3.

SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2

Установка отрицательного значения LIMIT (например, LIMIT -1 OFFSET 2) вернет все строки, кроме первых 2, что приведет кудаление всего, кроме первых 2 строк - это также можно сделать, превратив SELECT .. WHERE .. IN () в SELECT .. WHERE .. NOT IN ()


В SQLite есть опция для включения части ORDER BY x LIMIT nнепосредственно в операторе DELETE без подзапроса.Эта опция не включена в Android и не может быть активирована, но это может быть интересно тем, кто использует SQLite в других системах:

 DELETE FROM table_name ORDER BY sort_column LIMIT 3
2 голосов
/ 21 марта 2012

Вы можете попробовать этот код

int id;

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

Идентификатор строки;

public void deleteRow(String id) {  
      myDataBase.delete(TABLE_NAME, KEY_ID + "=\" " + id+"\"", null);
    }
2 голосов
/ 21 марта 2012

Я сделаю:

db.delete(MYDATABASE_TABLE, "KEY_ID > "+ value, null);
2 голосов
/ 21 марта 2012

Кажется, что вы пропустили некоторые пробелы:

"where"+KEY_ID+"in..

должно быть:

"where "+KEY_ID+" in...

Более того, вам нужно использовать оператор limit вместоверх:

1 голос
/ 08 февраля 2018

Удалить первые N (100) строк в базе данных sqlite

Delete from table WHERE id IN 
(SELECT id FROM table limit 100)
1 голос
/ 21 марта 2012

Это немного длинная процедура, но вы можете сделать это так

сначала получите столбец идентификаторов таблицы, из которой вы хотите удалить определенные значения

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

}
0 голосов
/ 01 октября 2014

Вы можете использовать следующий режим: (в дополнение к ответу, предоставленному "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})  );**

Где {Table-X} относится к таблице, которую вы хотите удалить, _ID - это главный уникальный столбец DESC / ASC - в зависимости от того, хотите ли вы удалить верхние или последние записи и, наконец, в предложении «LIMIT», мы предоставляем коэффициент «n», используя другой запрос, который вызывает {Limit-Column} из { SpecificationTable}: содержит значение, для которого вы хотите удалить их.

Надеюсь, это кому-нибудь поможет.

Счастливое кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...