在Android中删除SQLite中的行

rob*_*y12 96 sqlite android delete-row corresponding-records

这可能是一个愚蠢的问题,但我是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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Shr*_*jan 176

你可以尝试这样:

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

要么

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

  • Vijay的答案是正确的,因为这个解决方案允许进行SQL注入,这是一个安全漏洞.例如:使用name参数的值:`name ="TRUE; <任何SQL命令>;"`=>'将执行任何SQL命令'.当然,如果该功能没有GUI,则不会出现问题. (60认同)
  • ...但我不同意您评论中的逆向工程部分。您必须在某处以某种方式定义您的查询,这意味着逆向工程始终是一个可能的安全漏洞(即使在您的解决方案中),尤其是在 Java 中,即使源代码被混淆。它只能更多地提高黑客攻击时间。另一方面,Google 的建议是使用选择参数,请查看这篇文章:[link](http://developer.android.com/training/basics/data-storage/databases.html#DeleteDbRow) (2认同)

Vij*_*jay 155

试试这样你可以得到你的解决方案

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


Ena*_*khi 55

最好也使用whereargs;

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

这就像使用此命令:

delete from tablename where id='1' and name ='jack'
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用删除功能是好的,因为它删除了sql注入.

  • 您能否详细说明您的答案,并提供有关您提供的解决方案的更多说明? (2认同)

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

}
Run Code Online (Sandbox Code Playgroud)


小智 13

试试这个代码

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


Gir*_*ran 8

试试这个代码......

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


小智 5

这非常有效:

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

您也可以参考此示例.