如果userName已知,我正在尝试检索userId。例如,在我创建的下面的函数中,接受userName并拆分userId;然而,它正在使应用程序崩溃。所以我认为以下功能肯定有问题,因为我发表评论,应用程序运行正常。
public int getUserId(String userName){
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT userId from users WHERE userName=" + userName;
Cursor cursor = db.rawQuery(query, null);
// Move to first row
cursor.moveToFirst();
int userId = cursor.getInt(cursor.getColumnIndex("userId"));
return userId;
}
修改
我也尝试使用以下代码将userId保存到共享首选项中,似乎这也会导致问题。
private void saveUserId(String key, int value) {
settings = getSharedPreferences("MYPREFS", 0);
editor = settings.edit();
editor.putInt(key, value);
editor.commit();
}
答案 0 :(得分:0)
您的问题是您将用户名直接插入到字符串中,并将其作为SQL表达式读取。
理论上,您可以将字符串包装成引号('
),但如果字符串包含引号或其他特殊字符,这仍会产生问题。
在SQL语句中使用字符串值的最安全(也是最简单)的方法是使用参数:
public int getUserId(String userName) {
SQLiteDatabase db = getReadableDatabase();
String query = "SELECT userId FROM users WHERE userName = ?";
String[] parameters = new String[] { userName };
Cursor cursor = db.rawQuery(query, parameters);
if (cursor.moveToFirst())
return cursor.getInt(0);
else
return -1; // not found
}
答案 1 :(得分:-1)
即使表中的自动增量值为integer
,当尝试从表中获取时,它也将返回text
。因此,如果您使用getInt()
,您将收到错误
要获得自动增量值,请使用getString()
代替getInt()
String[] args = { "somename"};
Cursor cursor = db.query("TABLE_NAME", null, "userName=?", args, null,null,null);
cursor.moveToFirst();
while(!cursor.isAfterLast())
{
int userid = Integer.ParseInt(cursor.getString(0));//here is 0 is postion of column **userId** in table TABLE_NAME
// or use this int userid = Integer.ParseInt(cursor.getString(cursor.getColumnIndex("userId")));
cursor.movToNext();
}
答案 2 :(得分:-1)
试试这个:
public int getUserId(String userName){
int userId;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName, new String[] { userId }, userName+ "=?",
new String[] { userName }, null, null, null, null);
while(cursor.moveToNext())
{
userId = cursor.getInt(cursor.getColumnIndex("userId"));
}
cursor.close();
return userId;
}