0

我想知道这种方法是否正确,可以验证“用户名”列中是否已经存在 _username 的值

public boolean verification(String _username) throws SQLException{
    Cursor c = dataBase.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_USERNAME+"="+_username, null);
    if (c!=null)
        return true; // return true if the value of _username already exists
    return false; // Return false if _username doesn't match with any value of the columns "Username"
}

有没有更好的方法来做同样的事情,我真的不确定,这似乎适合我。谢谢。

4

2 回答 2

6

当心SQL注入攻击!您应该始终使用参数化查询:

Cursor c = dataBase.rawQuery("SELECT 1 FROM "+TABLE_NAME+" WHERE "+KEY_USERNAME+"=?", new String[] {_username});

(老实说,我不确定您的第一个查询如何没有抛出异常,因为您忘记将字符串括在引号中......)

rawQuery()将始终返回一个 Cursor,您必须检查 Cursor 是否为,而不是null


至于“最佳”方法,这很好用,但我建议关闭光标以释放资源。全部一起:

public boolean verification(String _username) {
    Cursor c = dataBase.rawQuery("SELECT 1 FROM "+TABLE_NAME+" WHERE "+KEY_USERNAME+"=?", new String[] {_username});
    boolean exists = c.moveToFirst();
    c.close();
    return exists;
}
于 2013-03-23T16:13:51.040 回答
2

有没有更好的方法来做同样的事情,我真的不确定,这似乎适合我。谢谢。

就安全性和纯度而言,是的,当然。

public boolean verification(String _username) throws SQLException {
    int count = -1;
    Cursor c = null; 
    try {
       String query = "SELECT COUNT(*) FROM " 
                   + TABLE_NAME + " WHERE " + KEY_USERNAME + " = ?"
       c = dataBase.rawQuery(query, new String[] {_username});
       if (c.moveToFirst()) {
          count = c.getInt(0);
       }
       return count > 0;
    }
    finally {
       if (c != null) {
          c.close();
       }
    }
}

我建议您使用?一种称为placeholder的用法。每个占位符将按相同顺序替换为字符串数组中的值。这也称为参数化语句,作为对 SQL 注入的防御。完成 Cursor 的工作后,释放它。

于 2013-03-23T16:14:20.503 回答