Удаление строки в SQLite в Android

87

Это может быть глупый вопрос, но я новичок в SQLite, и я не могу понять этого. У меня есть 1 таблица с столбцами KEY_ROWID, KEY_NAME, KAY_LATITUDE и KEY_LONGITUDE. Я хочу, чтобы пользователь мог выбрать один и удалить его; Может ли кто-нибудь дать мне направление для начала? Мой вопрос заключается в фактическом удалении строки с указанием только ее имени.

Соответствующий код:

public class BeaconDatabase {

    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "beacon_name";
    public static final String KEY_LATITUDE = "beacon_lat";
    public static final String KEY_LONGITUDE = "beacon_lon";

    private static final String DATABASE_NAME ="BeaconDatabase";
    private static final String DATABASE_TABLE ="beaconTable";
    private static final int DATABASE_VERSION = 1;

    private DbHelper helper;
    private final Context context;
    private SQLiteDatabase db;

    public BeaconDatabase(Context context) {
        this.context = context;
    }

    public BeaconDatabase open() {
        helper = new DbHelper(this.context);
        db = helper.getWritableDatabase();
        return this;
    }

    public void close() {
        helper.close();
    }

    public long createEntry(String name, Double lat, Double lon) {
        ContentValues cv = new ContentValues();
        cv.put(KEY_NAME, name);
        cv.put(KEY_LATITUDE, lat);
        cv.put(KEY_LONGITUDE, lon);
        return db.insert(DATABASE_TABLE, null, cv);
    }

    public void deleteEntry(long row) {

              // Deletes a row given its rowId, but I want to be able to pass
              // in the name of the KEY_NAME and have it delete that row.
              //db.delete(DATABASE_TABLE, KEY_ROWID + "=" + row, null);
    }

    public String getData() {
        String[] columns = { KEY_ROWID, KEY_NAME, KEY_LATITUDE, KEY_LONGITUDE };
        Cursor cursor = db.query(DATABASE_TABLE, columns, null, null, null, null, null);
        String result = "";

        int iRow = cursor.getColumnIndex(KEY_ROWID);
        int iName = cursor.getColumnIndex(KEY_NAME);
        int iLat = cursor.getColumnIndex(KEY_LATITUDE);
        int iLon = cursor.getColumnIndex(KEY_LONGITUDE);

        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            result += cursor.getString(iRow) + ": " + cursor.getString(iName) + " - " + cursor.getDouble(iLat) + " latitude " + cursor.getDouble(iLon) + " longitude\n";
        }

        return result;

    }

    private static class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " +  DATABASE_TABLE + " (" + 
                    KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    KEY_NAME + " TEXT NOT NULL, " +
                    KEY_LATITUDE + " DOUBLE, " +
                    KEY_LONGITUDE + " DOUBLE);"
            );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }
    }
}
  • 0
    перейти с @iDroid ответ ... как это будет работать для меня. Спасибо iDroid.
Теги:
delete-row

17 ответов

168
Лучший ответ

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

 //---deletes a particular title---
public boolean deleteTitle(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "=" + name, null) > 0;
}

или же

public boolean deleteTitle(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{name}) > 0;
}
  • 57
    Ответ Виджая является правильным, потому что это решение позволяет сделать SQL-инъекцию, которая является утечкой безопасности. Например: используйте значение аргумента name: name = "TRUE; <any SQL command>;" => «любая команда SQL» будет выполнена. Конечно, это не проблема, если для этой функции нет графического интерфейса.
  • 0
    @bdevay Мой ответ о фоновой задаче, которую мы выполнили с помощью запроса. Так что это не связано с пользовательским интерфейсом. Вы просто должны предоставлять информацию динамически, чтобы не было необходимости в защите. Если вы следуете ответу Виджая, а кто-то занимается обратным инжинирингом, вы можете получить информацию о таблице в базе данных и поле, которое вы заполняете. что я делаю прямо в запросе, поэтому нет шансов получить его порей.
Показать ещё 8 комментариев
150

Попробуйте, чтобы вы получили свое решение

String table = "beaconTable";
String whereClause = "_id=?";
String[] whereArgs = new String[] { String.valueOf(row) };
db.delete(table, whereClause, whereArgs);
51

лучше использовать и другие значения;

db.delete("tablename","id=? and name=?",new String[]{"1","jack"});

это похоже на использование этой команды:

delete from tablename where id='1' and name ='jack'

и использование функции удаления таким образом хорошо, потому что оно удаляет SQL-инъекции.

  • 1
    Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?
  • 1
    Я думаю, что стоит использовать whereargs .
Показать ещё 1 комментарий
17

Пока я понимаю ваш вопрос, вы хотите установить два условия для выбора строки, которую нужно удалить. Для этого вам нужно сделать:

public void deleteEntry(long row,String key_name) {

      db.delete(DATABASE_TABLE, KEY_ROWID + "=" + row + " and " + KEY_NAME + "=" + key_name, null);

      /*if you just have key_name to select a row,you can ignore passing rowid(here-row) and use:

      db.delete(DATABASE_TABLE, KEY_NAME + "=" + key_name, null);
      */  

}
12

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

public void deleteRow(String value)
{
SQLiteDatabase db = this.getWritableDatabase();       
db.execSQL("DELETE FROM " + TABLE_NAME+ " WHERE "+COlUMN_NAME+"='"+value+"'");
db.close();
}
  • 0
    Как я могу назвать это, когда я хочу удалить? db.deleteRow ();
  • 0
    мы можем вызвать его, передав значение в качестве параметра, который вы хотите удалить. Вызовите как db.deleteRow («имя»);
8

Попробуйте этот код...

private static final String mname = "'USERNAME'";
public void deleteContact()
{
    db.delete(TABLE_CONTACTS, KEY_NAME + "=" + mname, null);
}
5

Это отлично работает:

public boolean deleteSingleRow(String rowId) 
{
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

Вы также можете обратиться к в этом примере.

2

Чтобы удалить строки из таблицы, необходимо предоставить критерии выбора, которые идентифицируют строки для метода delete(). Механизм работает так же, как аргументы выбора для метода query(). Он делит спецификацию выбора на предложение выбора (предложение where) и аргументы выбора.

    SQLiteDatabase db  = this.getWritableDatabase();
     // Define 'where' part of query.
    String selection = Contract.COLUMN_COMPANY_ID + " =?  and "
                       + Contract.CLOUMN_TYPE +" =? ";
   // Specify arguments in placeholder order.
    String[] selectionArgs = { cid,mode };
    // Issue SQL statement.
    int deletedRows = db.delete(Contract.TABLE_NAME, 
                       selection, selectionArgs);
    return deletedRows;// no.of rows deleted.

Возвращаемое значение для метода delete() указывает количество строк, которые были удалены из базы данных.

  • 0
    Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
  • 0
    Я обязательно запомню это ..
2

Ребята, это общий метод, который вы можете использовать для всех ваших таблиц, отлично работает в моем случае.

public void deleteRowFromTable(String tableName, String columnName, String keyValue) {
    String whereClause = columnName + "=?";
    String[] whereArgs = new String[]{String.valueOf(keyValue)};
    yourDatabase.delete(tableName, whereClause, whereArgs);
}
  • 0
    String.ValueOf (keyValue) => не могли бы вы объяснить эту строку?
  • 1
    Нет необходимости в String.ValueOf (keyValue), потому что keyValue уже является строкой. в других случаях мы используем этот массив whereArgs для определения значения имени столбца.
1

Работает отлично!

public void deleteNewMelk(String melkCode) {
    getWritableDatabase().delete(your_table, your_column +"=?", new String[]{melkCode});
}
1

если вы используете SQLiteDatabase, тогда существует метод удаления

Определение удаления

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

Пример реализации

Теперь мы можем написать метод удалить с аргументом как имя

public void delete(String value) {
    db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{String.valueOf(value)});
}

если вы хотите удалить все записи, а затем просто передать null указанному выше методу,

public void delete() {
    db.delete(DATABASE_TABLE, null, null);
}

Источник информации

  • 0
    Если строковое значение связано с внешним ключом, то ??
1

Ребята, если вышеупомянутые решения не сработают для вас, попробуйте это и потому, что это сработало для меня.

public boolean deleteRow(String name) 
{
    return db.delete(DATABASE_TABLE, KEY_NAME + "='" + name +"' ;", null) > 0;
}
0

У меня проблема с удалением моих данных в ListView. Вот код для сохранения данных, но не может удалить:

final SQLiteDatabase db = mHelper.getWritableDatabase();
final ContentValues values = new ContentValues();
values.put(InputContract.TaskEntry.COL_TASK_TITLE,   input);     
db.insertWithOnConflict(InputContract.TaskEntry.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);                                        
db.close();
updateUI();

Кто знает в чем проблема?

Как я могу удалить некоторые данные?

0

Попробуйте ниже code-

mSQLiteDatabase = getWritableDatabase();//To delete , database should be writable.
int rowDeleted = mSQLiteDatabase.delete(TABLE_NAME,id + " =?",
                    new String[] {String.valueOf(id)});
mSQLiteDatabase.close();//This is very important once database operation is done.
if(rowDeleted != 0){
    //delete success.
} else {
    //delete failed.
}
0

Вы можете сделать что-то вроде этого, делясь своим фрагментом рабочего кода

Убедитесь, что запрос похож на этот

УДАЛИТЬ ИЗ tableName ГДЕ                     KEY__NAME = 'параметрToMatch'

public void removeSingleFeedback(InputFeedback itemToDelete) {
            //Open the database
            SQLiteDatabase database = this.getWritableDatabase();

            //Execute sql query to remove from database
            //NOTE: When removing by String in SQL, value must be enclosed with ''
            database.execSQL("DELETE FROM " + TABLE_FEEDBACKS + " WHERE "
                    + KEY_CUSTMER_NAME + "= '" + itemToDelete.getStrCustName() + "'" +
                    " AND " + KEY_DESIGNATION + "= '" + itemToDelete.getStrCustDesignation() + "'" +
                    " AND " + KEY_EMAIL + "= '" + itemToDelete.getStrCustEmail() + "'" +
                    " AND " + KEY_CONTACT_NO + "= '" + itemToDelete.getStrCustContactNo() + "'" +
                    " AND " + KEY_MOBILE_NO + "= '" + itemToDelete.getStrCustMobile() + "'" +
                    " AND " + KEY_CLUSTER_NAME + "= '" + itemToDelete.getStrClusterName() + "'" +
                    " AND " + KEY_PRODUCT_NAME + "= '" + itemToDelete.getStrProductName() + "'" +
                    " AND " + KEY_INSTALL_VERSION + "= '" + itemToDelete.getStrInstalledVersion() + "'" +
                    " AND " + KEY_REQUIREMENTS + "= '" + itemToDelete.getStrRequirements() + "'" +
                    " AND " + KEY_CHALLENGES + "= '" + itemToDelete.getStrChallenges() + "'" +
                    " AND " + KEY_EXPANSION + "= '" + itemToDelete.getStrFutureExpansion() + "'" +
                    " AND " + KEY_COMMENTS + "= '" + itemToDelete.getStrComments() + "'"
            );

            //Close the database
            database.close();
        }
0
public boolean deleteRow(long l) {
    String where = "ID" + "=" + l;
    return db.delete(TABLE_COUNTRY, where, null) != 0;
}
0

Попробуйте следующее:

public void deleteEntry(long rowId) {
    database.delete(DATABASE_TABLE , KEY_ROWID 
        + " = " + rowId, null);}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню