Как удалить определенные строки в базе данных SQLite

Я новичок в Android, и у меня возникли проблемы с пониманием функции удаления в базе данных sqlite. Я создал свою базу данных, используя строку

private static final String TABLE_NAME="NameInfo";
    private static final String POSITION_DB ="_id";
    private static final String Name_DB ="name";
    private static final String JSONOBJECT_DB="json";
    private static final String TIMESTAMP_DB="time";
    private static final String USERRATING_DB="userrating";
    private static final String DATABASE_NAME ="database.db";    
private final String createDb ="create table if not exists "+TABLE_NAME +" ("
                + POSITION_DB + " integer primary key, "
                + NAME_DB + " text not null, "
                + JSONOBJECT_DB + " text not null, "
                + USERRATING_DB + " text not null, "
                +TIMESTAMP_DB + " text not null); ";

Теперь, когда я запускаю свое приложение, я хочу, чтобы все строки, которые были добавлены более 2 дней назад, были удалены.

так что я планирую сделать что-то вроде этого

long currentdate =new date().getTime();

и проверьте разницу между полем currenttime-Long.Valueof(TIMESTAMP_DB) для каждой строки таблицы и, если оно больше 2*24*60*60, чем удалите эту строку

Может кто-нибудь, пожалуйста, скажите мне, как я могу использовать приведенную ниже функцию для достижения вышеуказанного

public int delete (String table, String whereClause, String[] whereArgs)

я не уверен, что я должен написать в whereClause и whereArgs.

Я был бы очень признателен, если бы кто-нибудь мог сказать мне еще лучший и простой подход, чем этот.

PS я также пытался выполнить оператор execSQL, но не смог написать полный запрос database.execSQL("Delete * from "+TABLE_NAME+" WHERE = "+currentdate - Long.ValueOf(?) >2*24*60*60 ;")

Заранее спасибо.


person bourne    schedule 29.07.2013    source источник
comment
delete никогда не содержит * в строке запроса..   -  person Chintan Rathod    schedule 29.07.2013
comment
о, большое спасибо Chintan, который я использовал *, потому что я хотел удалить весь ряд. Можете ли вы сказать мне, что я должен использовать вместо этого   -  person bourne    schedule 29.07.2013
comment
пожалуйста, прочитайте мой ответ, мой друг. Удалить удалит строку за раз, если условие истинно. вы не можете удалить/удалить поле строки :)   -  person Chintan Rathod    schedule 29.07.2013


Ответы (4)


Вы можете использовать такой запрос:

db.execSQL("DELETE FROM " + TABLE_NAME +
           " WHERE " + currentdate + " - " + TIMESTAMP_DB + " > 2*24*60*60");

Для метода update напишите выражение SQL в предложении WHERE параметра whereClause; whereArgs нужен только для строковых значений:

db.update(TABLE_NAME, currentdate + " - " + TIMESTAMP_DB + " > 2*24*60*60", null);
person CL.    schedule 29.07.2013
comment
Может ли что-то подобное работать db.execSQL(String.format(DELETE FROM %s WHERE %s ‹ %d, Table_NAME,Table_ColumnName,currentDate-2*24*60*60)) - person bourne; 29.07.2013
comment
Единственное сомнение, которое у меня есть в приведенном выше запросе, заключается в том, что, поскольку вычитание не произойдет, если мы напишем как currentdate+-+TIMESTAMP_DB, так как он примет их как строку - person bourne; 29.07.2013
comment
Добавление значения переменной currentdate к строке SQL не приведет к строковому значению в выражении SQL; результатом будет что-то вроде 12345678 - time > 2*24*60*60, что совершенно нормально. - person CL.; 29.07.2013

Вы также можете сделать так::

db.execSQL(String.format("DELETE FROM %s WHERE %s = %d",
                Table_NAME,Table_ColumnName,Integer.parseInt(Value)));

Он выполнит оператор напрямую.

и, как вы спросили, WhereClause означает имена столбцов и выражение, которое вы хотите использовать. и Где args - это массив строк, поэтому вам нужно передать значения аргументов для выражения, которое вы написали.

db.delete(Table_NAME, ColumnName+" = ", String[]{Value});
person Armaan Stranger    schedule 29.07.2013
comment
Спасибо, Armaan, я думаю, что-то вроде этого может работать db.execSQL(String.format(DELETE FROM %s WHERE %s ‹ %d, Table_NAME, Table_ColumnName, currentDate-2*24*60*60)); - person bourne; 29.07.2013
comment
сначала вычислите дату в любой переменной, а затем передайте ее в строке запроса, чтобы было проще. - person Armaan Stranger; 29.07.2013
comment
написал такую ​​функцию public void deleteOldRows(SQLiteDatabase database){ long nowTime = new Date().getTime(); long difference = nowTime -2*24*60*60; database.execSQL(String.format("DELETE FROM %s WHERE %s < %d", TABLE_NAME,TIMESTAMP_DB,String.valueOf(difference))); } - person bourne; 29.07.2013
comment
Здесь вы использовали разницу в String, хорошо ли она проверяет условие ?? - person Armaan Stranger; 29.07.2013
comment
потому что я думаю, что использование '‹' в строке не сработает. вам понадобятся длинные или двойные значения для этого. проверьте, работает ли он. - person Armaan Stranger; 29.07.2013

Это очень «огромный» вопрос, и может иметь больше рабочих подходов, зависящих от ваших личных требований, например, безопасности, производительности и т. д.

Сначала я рекомендую вам использовать параметризованные операторы вместо ваших «закодированных», которые небезопасны и мало читаемы человеком, поэтому используйте заполнители, например.

select * from test where id = ?

Во-вторых, для удаления строк из таблицы используйте встроенную функцию API delete()< /а>. И, как указал @Chintan Rathod, ваше заявление об удалении недействительно.

Теперь к вашему вопросу. Поскольку вы хотите удалить строки из-за указанной временной метки, я предлагаю вам вставить каждую строку с указанной датой в определенном формате даты (вы можете просто использовать SimpleDateFormat. Тогда есть и другие подходы, как вы можете это сделать. Я предпочитаю сначала запрашивать таблицу и помещать простое условие, если между фактическими дата и дата, хранящиеся в строке, отличаются друг от друга на 2 дня, затем сохраните его rowId. Наконец, у вас есть идентификаторы строк, которые вы хотите удалить.

Но прямо сейчас вы точно не знаете, сколько строк вы хотите удалить, поэтому вам нужно:

  1. удалять записи в цикле (API меньше 11)
  2. Создать динамический запрос с предложением IN
  3. Начиная с Android API 11 существует метод, позволяющий удалять несколько записей. Здесь вы можете создать «динамический» оператор из-за размера идентификаторов (хранящихся в некотором динамическом массиве).

Примеры:

Первый подход:

List<Integer> ids = new ArrayList<Integer>();
...
for (int id: ids) {
   db.delete("table", "_id = ?", new String[] {String.valueOf(id)});
}

Второй подход:

List<Integer> ids = new ArrayList<Integer>();
...
StringBuilder b = new StringBuilder("delete from table where _id IN(");
String[] whereArgs = new String[ids.size()];
int index = 0;
for (int id: ids) {
   whereArgs[index] = String.valueOf(id);
   b.append("?");
   if (index < ids.size() - 1) {
      b.append(",");
   }
   index++;
}
b.append(")");

db.execSQL(b.toString(), whereArgs);

Третий подход:

То же, что и выше, но вы можете использовать SQLiteStatement:

SQLiteDatabase db; // instantiated SQLiteDatabase
SQLiteStatement stm = db.compileStatement(b.toString());
stm.executeUpdateDelete();


Примечание: Поскольку вы хотите удалить несколько записей (иногда вам нужно удалить 10 000 и более строк), попробуйте подумать о TRANSACTIONS, которые быстро повышают производительность и безопасность.

person Simon Dorociak    schedule 29.07.2013
comment
Привет, Саймон, большое спасибо за подробный ответ, могу ли я использовать подобную функцию также для удаления строки public void deleteOldRows(SQLiteDatabase database) { long nowTime = new Date().getTime(); long difference = nowTime -2*24*60*60; database.execSQL(String.format("DELETE FROM %s WHERE %s < %d", TABLE_NAME,TIMESTAMP_DB,String.valueOf(difference))); } - person bourne; 29.07.2013
comment
@bourne, вы можете попробовать, я никогда не пользовался вашим подходом, поэтому не могу сказать, сработает ли он на 100%. - person Simon Dorociak; 29.07.2013
comment
@Sajmon Обратите внимание, что Android API заменяет параметры значениями string, поэтому SQL не будет работать, если только сравнения не будут выполняться со столбцами, которые имеют привязка номеров. В Android параметры следует использовать только для строк. - person CL.; 29.07.2013
comment
@КЛ. спасибо, но у меня никогда не было проблем с тем, что вы описываете. И я много работаю с SQLiteDatabase. - person Simon Dorociak; 29.07.2013

public void deleteContact(Integer id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete("AddressList",
                "id = ? ",
                new String[]{Integer.toString(id)});
}

or

вы можете использовать необработанный SQL-запрос для удаления строки

public void deleteContact(Integer id) {
  SQLiteDatabase database = this.getWritableDatabase();
 String s = "DELETE FROM AddressList WHERE item_id=" + id;
database.execSQL(s);
}

здесь AddressList — ваше имя TABLE

person sivaBE35    schedule 04.05.2016