android - 在 SQLITE (android) 中删除多行

标签 android sqlite

<分区>

我想从表中删除与数组中的 ID 匹配的所有行。我可以通过以下两种方法中的任何一种来做到这一点(两种方法都有效)。你能告诉我哪个更好吗?

方法一:

public void deleteRec(String[] ids) { //ids is an array
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, KEY_ID+" IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids);
        db.close();
    }

方法二:

public void deleteRec(String[] ids) { //ids is an array
        String allid = TextUtils.join(", ", ids);
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL(String.format("DELETE FROM "+TABLE_NAME+" WHERE "+KEY_ID+" IN (%s);", allid));
       db.close();
    }

最佳答案

忘记第二种方法吧!

您的 ids 都是来自数字的字符串(否则 SQL 会失败),但是对于通用字符串数据,将数据传递到 SQL 语句从来都不是一个好主意。让您的应用程序容易受到 SQL 注入(inject)攻击:

String.format("DELETE FROM t WHERE ID='%s', "1' AND 1=1 --")
// = "DELETE FROM t WHERE ID='1' AND 1=1 --'" => would delete all data!

并且可能会使您的 SQL 语句失败:

String.format("DELETE FROM t WHERE v='%s', "It's me!")
// = "DELETE FROM t WHERE v='It's me!'" => syntactically incorrect (quote not escaped)!

编辑:由于 ids 是作为字符串数组提供的,并且可能 KEY_ID 指的是 INT 列,因此方法 1 应适用于:

db.delete(TABLE_NAME, "CAST("+KEY_ID+" AS TEXT) IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids);

关于android - 在 SQLITE (android) 中删除多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855397/

相关文章:

ios - 一个应用程序可以访问另一个应用程序的 sqlite 表吗? - iPhone iOS

python - SqlAlchemy/Sqlite距离计算

java - 通过 SQLite Manager 更新我的 SQLite 数据库列后,为什么更改没有反射(reflect)在我的 Android 应用程序中?

mysql - 目录 : how do I test my app against multiple databases?

java - SQLite 数据库没有被创建..为什么?

android - 如何使用 onLongPress 适配器删除列表项

java - 如何反序列化可能是字符串、对象或列表的 json/gson

android - 如何在 Android 的日期选择器中显示 7 天回溯日期

android - 检测 Compose TextField 中的点击

java - 可变高度 ListView