Android - 删除记录时出现 SQLiteException

Android - SQLiteException while deleting record

目前我们有一个应用程序在从数据库中删除记录时收到许多崩溃报告。

这是应用程序崩溃的方法。

public int deleteGroupMap(String nickName) {
    SQLiteDatabase database = this.getWritableDatabase();
    try {
        return database.delete(TABLE_NAME_GROUP_MAP, COLUMN_GMAP_NICK_NAME + " = '" + nickName + "'", null);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        database.close();
    }
    return 0;
}

但我们遇到以下异常:

android.database.sqlite.SQLiteException: near "adz": syntax error (code 1): , while compiling: DELETE FROM groups_map WHERE gmap_nick_name = ''adz.'

任何帮助将不胜感激。

这样试试

public int deleteGroupMap(String nickName) {
SQLiteDatabase database = this.getWritableDatabase();
try {
   database .execSQL("DELETE FROM "+ TABLE_NAME_GROUP_MAP + " WHERE " + COLUMN_GMAP_NICK_NAME  + " = "+nickName+"");
   database .close();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    database.close();
}
return 0;
}

delete签名:

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

第三个参数是 args:

You may include ?s in the where clause, which will be replaced by the values from whereArgs. The values will be bound as Strings.

自动转义,无需手动加引号(', ")

使用 where args 而不是字符串连接:

database.delete(TABLE_NAME_GROUP_MAP, COLUMN_GMAP_NICK_NAME + " = ?", new String[] { nickName });

试试这个

return database.delete(TABLE_NAME_GROUP_MAP, COLUMN_GMAP_NICK_NAME + "= ?" , new String[]{Long.toString(nickName)});

您还应该使用参数标记,因为当源包含特殊字符时直接附加值容易出错。

尝试以下操作,因为它还会阻止 SQL 对您的应用进行注入

database.delete(TABLE_NAME_GROUP_MAP, COLUMN_GMAP_NICK_NAME + "=?", new String[]{String.valueOf(昵称));