我想用sqlite表检查用户名和密码,在我的情况下,查询总是返回false ...
这是我的查询...
public boolean validateUser(String u_name, String p_word){
Cursor c = getReadableDatabase().rawQuery(
"SELECT FNAME,PASSWORD FROM " + TABLE_NAME + " WHERE "
+ fname + "='" + u_name+"'AND "+ password +"='"+ p_word+"'" , null);
if (c!=null)
{
return true;
}
else{
return false;
}
}
答案 0 :(得分:0)
检查Cursor是否为null基本上没用,因为rawQuery将返回有效的Cursor。也就是说,没有要提取的数据将导致没有行的空Cursor,而如果已经提取了数据,则Cursor将有1行或更多行。
你应该使用Cursor getCount()
方法检查Cursor是否为空,如果没有行或行数,它将返回0。或者你可以使用一些Cursor的移动方法,它们将返回true / false,具体取决于是否可以执行移动。例如if (c.moveToFirst) { ... //row(s) exist} else { ... //no rows exists }
。
您还应该在返回之前关闭Cursor。所以也许可以使用: -
public boolean validateUser(String u_name, String p_word){
Cursor c = getReadableDatabase().rawQuery(
"SELECT FNAME,PASSWORD FROM " + TABLE_NAME + " WHERE "
+ fname + "='" + u_name+"'AND "+ password +"='"+ p_word+"'" , null);
int count = c.getCount(); // get the number of rows
c.close(); // Close the Cursor
return count > 0; // return result (no data found = false, else true)
许多人建议不使用rawQuery,而是使用方便的Cursor query
方法。这可能是: -
public boolean validateUser(String u_name, String p_word) {
String[] columns = new String[]{
FNAME,
PASSWORD
};
String whereclause = FNAME + "=? AND " + PASSWORD + "=?";
String[] whereargs = new String[]{
u_name,
p_word
};
Cursor c = this.getWritableDatabase().query(
TABLE_NAME,
columns,
whereclause,
whereargs,
null,null,null
);
int count = c.getCount();
c.close();
return count > 0;
}
FNAME
和PASSWORD
是用于列名的正确字符串变量,而不是fname
和password