【问题标题】:Search for a specific string in an SQLite database - Android SDK在 SQLite 数据库中搜索特定字符串 - Android SDK
【发布时间】:2021-02-21 14:20:13
【问题描述】:

我在 Android SDK 中使用 SQLite 数据库,我知道这是一个非常简单的问题,但我有以下功能。我正在尝试搜索用户名是否在 SQL 数据库中,但我想不出我将如何构建查询。

如果字符串“user”在表“ACCOUNT_TABLE”中,搜索的正确方法是什么

public boolean isUser(String user){
        SQLiteDatabase db = this.getReadableDatabase();
        String queryString = "SELECT " + COLUMN_USERNAME + " FROM " + ACCOUNT_TABLE + " WHERE " (???);

        db.close();
        /*if(found in database) 
            return true;
        else 
            return false;*/
    }

【问题讨论】:

  • 我既不精通 SQL lite,也不精通 Java,但我注意到您没有在“WHERE”子句中指定列。另外,我强烈建议使用准备好的语句而不是原始 SQL,以保护自己免受 SQL 注入。这里似乎有一个不错的教程:sqlitetutorial.net/sqlite-java/select
  • 是的,我计划稍后使用查询参数重新格式化它。只是暂时不知道怎么弄。我去看看链接,谢谢!

标签: java android sql sqlite android-sqlite


【解决方案1】:

正确的做法是使用rawQuery() 方法,它需要两个参数:

  1. 带有 ? 占位符的 sql SELECT 语句用于您要传递的参数
  2. String 数组包含 sql 语句参数的所有值,按照它们出现在 声明

rawQuery() 返回一个Cursor,您可以检查它是否包含任何行,如果包含,则表示您搜索的user 存在于表中:

public boolean isUser(String user) {
    SQLiteDatabase db = this.getReadableDatabase();
    String queryString = "SELECT 1 FROM " + ACCOUNT_TABLE + " WHERE " + COLUMN_USERNAME + " = ?";
    Cursor c = db.rawQuery(queryString, new String[]{user});
    boolean result = c.getCount() > 0;
    c.close();
    db.close();
    return result;
}

【讨论】:

  • 你不应该调用 db.close() 这对性能不利
【解决方案2】:

试试这个查询:

String queryString = "SELECT " + COLUMN_USERNAME + " FROM " + ACCOUNT_TABLE + " WHERE COLUMN_USERNAME like ‘%" +users+”%’”;

这里COLUMN_USERNAME 是您的database columnUsers 是您要搜索的string

【讨论】:

  • 这很危险,因为搜索“tobi”时也会返回用户“tobias”
  • 那么String queryString = "SELECT " + COLUMN_USERNAME + " FROM " + ACCOUNT_TABLE + " WHERE " + COLUMN_USERNAME + " = %" + user +"%"; 正确吗?
  • 不,%tobi% 将使 tobiargtobitobias 返回 true
  • 就像我的回答一样=user
  • 使用“like”运算符而不是“=”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多