谁能告诉我这是怎么回事?

时间:2019-03-29 19:55:33

标签: sqlite

public  void deleteData(String name,int itemID){

    SQLiteDatabase db=getWritableDatabase();
    String query="DELETE FROM "+ TABLE_NAME + " WHERE "+ "'"+ COL1 +"'"+ " = "+ itemID + " AND "+ "'" + COL2 + "'" +" ="+ " '"+ name + "'";
   db.execSQL(query);

    db.execSQL(query);
}

1 个答案:

答案 0 :(得分:0)

以下是错误的,或者可能被认为是错误的。

  1. 应该不需要两次调用完全相同的查询。

  2. 在适合的情况下,最好使用Android SDK的便捷方法(而不是使用 execSQL 方法而不是 delete 方法更合适)。 / p>

  3. 在直接作为SQL执行的字符串中直接使用参数时,有可能发生SQLinjection攻击(请注意解析2并使用适当的参数可以解决此问题)。

  4. 除非列名用无效的名称命名,否则不需要将列名用单引号或其他字符引起来(无效的名称会使生活变得困难,因此如果使用,许多人会认为它们是错误的)。 / p>

  5. 如果删除(第一个)不起作用,或者使用pragma count_changes后删除似乎未返回适当的结果,可能是由于该行不存在(该行是否被获取)插入?)还是第二个查询什么都不会删除,所以它隐藏了第一个查询的结果。

    1. pragma count_changes在更高版本的SQLite中已弃用,因此不应再使用(尽管Android的SQlite版本通常落后一些)。

作为对所有不存在的ID的修复,您可以使用以下命令:-

public  int deleteData(String name,int itemID){

    SQLiteDatabase db=getWritableDatabase();
    String whereclause = COL1 + "=? AND " + COL2 + "=?";
    String[] whereargs = new String[]{String.valueOf(int),name};
    return db.delete(TABLE_NAME,whereclause,whereargs);
}
  • 请注意,方法签名会导致返回 int ,这就是删除的行数。