public int getUserCred(User user){
database = opener.getReadableDatabase();
String first = user.getFirst();
String pass = user.getPassword();
String[] cols = {COL_FIRST, COL_PASS};
userCursor = database.query(TABLE_USER, cols, null, null, null, null, null);
if(userCursor != null & userCursor.moveToFirst()) {
String firstName = userCursor.getString(userCursor.getColumnIndex(COL_FIRST));
String password = userCursor.getString(userCursor.getColumnIndex(COL_PASS));
if(first.equals(firstName) & pass.equals(password)){
return User.CRED_CORRECT;
}
}
database.close();
userCursor.close();
return User.CRED_INCORRECT;
}
我的代码就像现在一样,虽然illegalStateException
一直在向我抛出,说它无法访问第0行col -1。现在我知道数据保存在游标中,因为cursor.getString(0)
和cursor.getString(1)
正在返回数据,但使用cursor.getColumnIndex(COL_(FIRST/PASS))
会不断引发异常。
有人可以向我解释为什么要对我这样做吗?最初我在一个接口中保存了所有SQLITE模式语句,这是我认为由于某种原因引起问题的原因,但是然后将它们放在一个嵌套类中引发了同样的异常,所以我决定在我的SQLiteOpenHelper子类中创建它们的类变量。但是,这仍然没有改变我的getColumnIndex()
情况。
所以,如果有人能指出我正确的方向,我将非常感激!
答案 0 :(得分:1)
COL_FIRST =" FIRSTNAME" COL_PASS =" PASSWORD&#34 ;;领先的空白
问题是空白和实现细节。
当字符串用作SQL字符串的一部分时,额外的空格并不重要。当使用例如在query()
中 - 本质上args只是连接在一起形成一个SQL字符串,即使有额外的空格,sqlite也能正确解析它。
Cursor#getColumnIndex()
是一种界面方法,但我们假设通常为SQLiteCursor
implementation。它不适用于SQL级别。 sqlite报告的列名和索引放在Map
中,然后使用给定的列名查找。这意味着列名必须与完全匹配列名称与sqlite的匹配。具体做法是:
周围的空格不是列名的一部分。
Map
按键查找区分大小写,而SQL本身则不区分。