Удалить строку в таблице базы данных, используя одно значение столбца, которое является строкой - PullRequest
17 голосов
/ 23 июля 2010

У меня есть таблица с заголовками столбцов: | _id (длинный) | Имя (Строка) | х (целое число) | 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)?

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

Ответы [ 4 ]

38 голосов
/ 23 июля 2010

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

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

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

1 голос
/ 23 июля 2010

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

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

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

0 голосов
/ 22 октября 2012

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

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

    }
0 голосов
/ 23 июля 2012

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

например, если вы хотите удалить все записи, чей "_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 +")");

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

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