Xóa hàng trong SQLite trong Android


102

Đây có thể là một câu hỏi ngớ ngẩn, nhưng tôi mới sử dụng SQLite và dường như tôi không thể hiểu được điều này. Tôi có 1 bảng có các cột KEY_ROWID, KEY_NAME, KAY_LATITUDE, và KEY_LONGITUDE. Tôi muốn người dùng có thể chọn một và xóa nó; Bất cứ ai có thể cho tôi một hướng để bắt đầu? Câu hỏi của tôi là xóa thực tế hàng chỉ có tên của nó.

Mã liên quan:

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

đi với câu trả lời @iDroid ... vì nó sẽ hoạt động với tôi. Cảm ơn iDroid.

Câu trả lời:


183

Bạn có thể thử như thế này:

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

hoặc là

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

61
Câu trả lời của Vijay là chính xác vì giải pháp này cho phép thực hiện việc chèn SQL vốn là một rò rỉ bảo mật. Ví dụ: sử dụng giá trị của đối số name: name = "TRUE; <any SQL command>;"=> 'bất kỳ lệnh SQL nào' sẽ được thực thi. Tất nhiên sẽ không thành vấn đề nếu không có GUI cho tính năng đó.
bdevay

@bdevay Câu trả lời của tôi là về nhiệm vụ nền mà chúng tôi đã thực hiện với truy vấn. Vì vậy, nó không liên quan đến giao diện người dùng. Bạn chỉ cần cung cấp thông tin dưới dạng động nên không cần bảo mật. Nếu bạn làm theo câu trả lời của vijay và một số người thực hiện kỹ thuật đảo ngược thì bạn có thể nhận được thông tin về bảng trong cơ sở dữ liệu và trường bạn đang so sánh. mà tôi đang thực hiện trực tiếp trong truy vấn nên không có cơ hội để có được nó.
Shreyash Mahajan

@iDroid Explorer: tất nhiên nếu không có thông tin người dùng nhập hoặc loại khả năng tạo truy vấn bên ngoài khác thì rủi ro bảo mật không cao hơn so với giải pháp khác. Tiếp tục trong bình luận tiếp theo ...
bdevay

1
... Nhưng tôi không đồng ý với phần thiết kế ngược trong nhận xét của bạn. Bạn phải xác định một nơi nào đó và bằng cách nào đó truy vấn của bạn, điều đó có nghĩa là kỹ thuật đảo ngược luôn có khả năng bị rò rỉ bảo mật (ngay cả trong trường hợp giải pháp của bạn), đặc biệt là trong Java ngay cả khi nguồn bị xáo trộn. Nó chỉ có thể làm tăng thời gian hack nhiều hơn. Mặt khác khuyến cáo của Google được sử dụng đối số lựa chọn, xin vui lòng kiểm tra bài viết này: link
bdevay

Ý tôi là với khái niệm không cung cấp giá trị tĩnh cho bất kỳ phương thức nào hoặc bất kỳ biến nào. Đó phải là tối đa của động lực học. Vì vậy, nó an toàn hơn sau đó đưa ra giá trị tĩnh. Dù sao thì tùy thuộc vào người dùng mà họ muốn tạo ra ứng dụng của họ an toàn đến mức nào.
Shreyash Mahajan

157

Hãy thử như vậy bạn có thể nhận được giải pháp của mình

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

58

tốt hơn là bạn nên sử dụng cả whereargs;

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

điều này giống như sử dụng lệnh này:

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

và sử dụng chức năng xóa theo cách như vậy là tốt vì nó loại bỏ các tiêm sql.


2
Bạn có thể vui lòng giải thích thêm câu trả lời của mình bằng cách thêm một chút mô tả về giải pháp bạn cung cấp không?
abarisone

1
Tôi nghĩ rằng nó là giá trị để sử dụng whereargs.
msysmilu

@Enkahi Đây có giống như các câu lệnh chuẩn bị sẵn trong SQLite không? Tôi đã sử dụng id=?cú pháp kinda này với PHP trước đây và nó có vẻ rất giống với cú pháp đó.
GeekWithGlasses,

17

Cho đến khi tôi hiểu câu hỏi của bạn, bạn muốn đặt hai điều kiện để chọn một hàng sẽ bị xóa. Vì vậy, bạn cần làm:

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

}

13

Hãy thử mã này

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

Làm cách nào để gọi điều này khi tôi muốn xóa? db.deleteRow ();
Phares

chúng ta có thể gọi nó bằng cách chuyển giá trị làm tham số mà bạn muốn xóa. Gọi là db.deleteRow ("tên");
Harman Khera

8

Hãy thử mã này ...

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


3

nếu bạn đang sử dụng SQLiteDatabase thì có một phương pháp xóa

Định nghĩa về Xóa

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

Triển khai ví dụ

Bây giờ chúng ta có thể viết một phương thức có tên là delete với đối số là tên

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

nếu bạn muốn xóa tất cả các bản ghi thì chỉ cần chuyển null cho phương thức trên,

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

Nguồn thông tin


Nếu giá trị chuỗi được gắn với khóa ngoại thì ??
Harsh Bhavsar

2

Các bạn, đây là một phương pháp chung mà bạn có thể sử dụng cho tất cả các bảng của mình, Hoạt động hoàn hảo trong trường hợp của tôi.

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

String.ValueOf (keyValue) => bạn có thể giải thích dòng này được không?
Anis

1
Không cần String.ValueOf (keyValue), vì keyValue đã là chuỗi. trong các trường hợp khác, chúng tôi đang sử dụng Mảng whereArgs này để xác định giá trị tên cột.
Naveed Ahmad

2

Để xóa hàng khỏi bảng, bạn cần cung cấp tiêu chí lựa chọn xác định các hàng cho delete()phương pháp. Cơ chế hoạt động giống như các đối số lựa chọn của query()phương thức. Nó chia đặc tả lựa chọn thành một mệnh đề lựa chọn (mệnh đề where) và các đối số lựa chọn.

    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.

Giá trị trả về cho delete()phương thức cho biết số hàng đã bị xóa khỏi cơ sở dữ liệu.


Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
Thomas Flinkow

1

Các bạn nếu các giải pháp trên không hiệu quả với bạn thì hãy thử giải pháp này cũng vì nó hiệu quả với tôi.

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

1

Hoạt động tuyệt vời!

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

0

Hãy thử cái này:

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

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

0

Bạn có thể làm điều gì đó như thế này, chia sẻ đoạn mã làm việc của tôi

Đảm bảo rằng truy vấn như thế này

XÓA TỪ 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();
        }

0

Hãy thử đoạn mã dưới đây-

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

Cách duy nhất phù hợp với tôi là

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"
         )
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.