【问题标题】:SQLite - Match results based on string value issueSQLite - 基于字符串值问题的匹配结果
【发布时间】:2019-11-26 17:17:23
【问题描述】:

我的 SQL Lite 代码目前在计算匹配结果时遇到问题。在我的应用程序中,用户将能够添加一个新文件夹并为其命名。在将文件夹添加到应用程序之前,我的代码将检查是否已经存在同名的文件夹,如果存在,它将提示用户。

使用下面的代码时,我收到一条错误消息,通知我该列不存在。如果我删除 WHERE 之后的所有内容,那么它可以完美运行并计算表中的每条记录。

我已经重新安装了应用程序并更改了数据库版本,使其完全干净,只是为了确保。我敢肯定它只是我缺少的非常小的东西。

public int countMatchingFolders (String folderName){

    String countQuery = "SELECT * FROM " + Primary_Table + " WHERE " + Col_FolderName + " = " + folderName;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    int cnt = cursor.getCount();
    cursor.close();
    return cnt;
 }

我收到的错误消息

android.database.sqlite.SQLiteException: no such column: testFolder (code 1): , while compiling: SELECT * FROM Folder_Table WHERE Col_FolderName = testFolder

任何帮助解决这个问题的帮助将不胜感激。

【问题讨论】:

    标签: android database sqlite


    【解决方案1】:

    错误是因为字符串值周围没有引号,所以它被视为表名而不是字符串。您应该使用绑定查询参数来解决此问题。绑定参数还可以防止 SQL 注入攻击:

    String countQuery = "SELECT * FROM " + Primary_Table + " WHERE " + Col_FolderName + " = ?";
    Cursor cursor = db.rawQuery(countQuery, new String[]{folderName});
    

    请注意,您可以使用"SELECT COUNT(*) as row_count" ... 让数据库引擎更有效地统计记录数。

    【讨论】:

    • 感谢您的快速响应,我已按照您的建议进行了更改。我知道我的代码中遗漏了一些信息,但完全忘记了字符串是如何处理的。
    • @user3403733 大多数语言中的字符串都需要引号。但是在这里你必须格外小心,因为可能来自用户输入的注入。通常,您应该避免通过直接连接任何可能来自用户的值来构建查询字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2018-12-17
    • 1970-01-01
    • 2011-06-15
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多