在 Android 中删除 SQLite 中的行

这可能是一个愚蠢的问题,但我是新的 SQLite 和我似乎不能弄清楚这一点。我有一个包含 KEY_ROWIDKEY_NAMEKAY_LATITUDEKEY_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);
}
}
}
312977 次浏览

Till i understand your question,you want to put two conditions to select a row to be deleted.for that,you need to do:

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


}

You can try like this:

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

or

public boolean deleteTitle(String name)
{
return db.delete(DATABASE_TABLE, KEY_NAME + "=?", new String[]{name}) > 0;
}

Try like that may you get your solution

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

This works perfectly:

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

You can also refer to this example.

Try this code...

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

it's better to use whereargs too;

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

this is like useing this command:

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

and using delete function in such way is good because it removes sql injections.

Try this one:

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

Guys this is a generic method you can use for all your tables, Worked perfectly in my case.

public void deleteRowFromTable(String tableName, String columnName, String keyValue) {
String whereClause = columnName + "=?";
String[] whereArgs = new String[]{String.valueOf(keyValue)};
yourDatabase.delete(tableName, whereClause, whereArgs);
}

Try this code

public void deleteRow(String value)
{
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_NAME+ " WHERE "+COlUMN_NAME+"='"+value+"'");
db.close();
}

Guys if above solutions don't work for you then try this one also because it worked for me.

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

if you are using SQLiteDatabase then there is a delete method

Definition of Delete

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

Example Implementation

Now we can write a method called delete with argument as name

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

if you want to delete all records then just pass null to the above method,

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

Source Of Information

You can do something like this, sharing my working code snippet

Make sure query is like this

DELETE FROM tableName WHERE KEY__NAME = 'parameterToMatch'

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

Try the below 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.
}

Works great!

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

To delete rows from a table, you need to provide selection criteria that identify the rows to the delete() method. The mechanism works the same as the selection arguments to the query() method. It divides the selection specification into a selection clause(where clause) and selection arguments.

    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.

The return value for the delete() method indicates the number of rows that were deleted from the database.

The only way that worked for me was this

fun removeCart(mCart: Cart) {
val db = dbHelper.writableDatabase
val deleteLineWithThisValue = mCart.f
db.delete(cons.tableNames[3], Cart.KEY_f + "  LIKE  '%" + deleteLineWithThisValue + "%' ", null)
}




class Cart {
var a: String? = null
var b: String? = null
var c: String? = null
var d: String? = null
var e: Int? = null
var f: String? = null


companion object {
// Labels Table Columns names
const val rowIdKey = "_id"
const val idKey = "id"
const val KEY_a = "a"
const val KEY_b = "b"
const val KEY_c = "c"
const val KEY_d = "d"
const val KEY_e = "e"
const val KEY_f = "f"
}
}


object cons {
val tableNames = arrayOf(
/*0*/ "shoes",
/*1*/ "hats",
/*2*/ "shirt",
/*3*/ "car"
)
}

But the Accepted answer Not worked for me. I think String should be In SQL, strings must be quoted. So, in my case this worked for me against the accepted answer :

 database.delete(TABLE_DAILY_NOTES, WORK_ENTRY_CLUMN_NAME + "='" + workEntry+"'", null);