Подтвердить что ты не робот

Удалить строку в таблице базы данных с учетом одного значения столбца - это строка

У меня есть таблица с заголовками столбцов: | _id (длинный) | Имя (строка) | x (целое число) | y (целое число) |

Я хочу удалить строку в таблице с именем myName.

// In onCreate
dbHelper = new DBAdapter(this);
dbHelper.open()

// Function in DBAdapter class
public boolean deleteTitleGivenName(String myName) 
{
    return dbHelper.delete(DATABASE_TABLE_2, KEY_NAME + "=" + myName, null) > 0;
}

// Function call in java code
dbHelper.deleteTitleGivenName(myName);  // this is where my code fails  

dbHelper.close();           

Как примечание: myName - это точно в базе данных. Кроме того, я не могу использовать ROWID, так как я получаю myName из ListView.

Я только начал программировать с Android, и я пробовал в течение нескольких дней, чтобы решить эту проблему. Является ли мое предложение WHERE правильным (KEY_NAME + "=" + myName)?

Спасибо заранее.

4b9b3361

Ответ 1

Конечно, это работает, хотя я бы рекомендовал

dbHelper.delete(DATABASE_TABLE_2, KEY_NAME + "=?", new String[] { myName })

по соображениям безопасности. Таким образом, вы можете иметь специальные символы, не нарушая ваш запрос. Это не работает?

Ответ 2

Попробуйте поместить значение предложения where в кавычки...

KEY_NAME + "='" + myName + "'"

Кроме того, плохой практикой (как правило) является использование предложения WHERE на основе строк. Это потому, что, если мое имя имеет апостроф, ваше приложение не будет работать. Вероятно, вам стоит искать альтернативный способ удаления записей из базы данных на Android.

Ответ 3

в зависимости от сложности вашего условия, метод "удалить" не будет лучшим решением.

например, если вы хотите удалить все записи, чья "_id" находится во второй таблице, например, вы должны писать в transactSQL: "... WHERE _id IN (SELECT _id FROM...", тогда лучшее решение может использовать метод ".execSQL()" непосредственно в вашей базе данных.

myDatabase.execSQL("DELETE FROM myTable WHERE _id IN (SELECT _id FROM myOtherTable)");

или вы можете пойти настоящим уродством и сделать что-то вроде:

int cursorRows = cursor.getCount();
String[] id2String = new String[cursorRows];
String id2StringUnique = "";
//for (int i=0;i<cursorRows;i++) {
int i=0;
for(cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()){    
    id2String[i] = String.valueOf(cursor.getLong(index_ID));
    if (i==0) {
        id2StringUnique = "'"+id2String[i]+"'";
    } else {
        id2StringUnique += ",'"+id2String[i]+"'";
    }
    i++;
}
dbHelper.delete(DATABASE_TABLE_2, "_id IN (", id2StringUnique +")");

в зависимости от количества элементов, у вас может возникнуть проблема с длиной/размером вашего аргумента, кроме того, что он непрактичен до крайности.

Ответ 4

просто попробуйте этот простой код

private void deleteItem()
 {
    try 
      {
      SQLiteDatabase db = mOpenHelper.getWritableDatabase();
      db.delete(TABLE_NAME, " title = 'haiyang'", null);
      setTitle("title");
    } catch (SQLException e) {

    }