Я пытаюсь создать простую форму входа в систему, в которой я сравниваю идентификатор входа и пароль, введенные на экране входа в систему, с данными, хранящимися в базе данных.
Я использую следующий запрос:
final String DATABASE_COMPARE =
"select count(*) from users where uname=" + loginname + "and pwd=" + loginpass + ");" ;
Проблема в том, я не знаю, как мне выполнить вышеуказанный запрос и сохранить возвращенное количество.
Вот как выглядит таблица базы данных (мне удалось успешно создать базу данных с помощью метода execSQl)
private static final String
DATABASE_CREATE =
"create table users (_id integer autoincrement, "
+ "name text not null, uname primary key text not null, "
+ "pwd text not null);";//+"phoneno text not null);";
Может ли кто-нибудь посоветовать мне, как я могу этого добиться? Если возможно, предоставьте образец фрагмента для выполнения вышеуказанной задачи.
SELECT COUNT(*)
иqueryNumEntries()
извлекать все записи и видеть, сколько их, т.е.cursor.getCount()
@scottyab параметризованный DatabaseUtils.queryNumEntries (db, table, whereparams) существует в API 11 +, тот, который без whereparams существует с API 1 . Ответом должно быть создание курсора с db.rawQuery:
Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null); mCount.moveToFirst(); int count= mCount.getInt(0); mCount.close();
Мне также нравится ответ @Dre с параметризованным запросом.
источник
mCount.getInt()
являетсяcolumnindex
. Спасибо вам за помощь!Используйте SQLiteStatement .
например
SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " ); long count = s.simpleQueryForLong();
источник
?
s в запросе, а затем использоватьbindString(int, String)
иbindLong(int, long)
для вставки значений. Смотрите здесь .См. RawQuery (String, String []) и документацию по Cursor.
Ваш SQL-оператор DADABASE_COMPARE в настоящее время недействителен
loginname
иloginpass
не будет экранирован, междуloginname
и нет пробелаand
, и вы завершаете оператор с помощью); вместо того ; - Если бы вы входили в систему как bob с паролем password, это выражение будет выглядеть какselect count(*) from users where uname=boband pwd=password);
Кроме того, вам, вероятно, следует использовать функцию selectionArgs вместо объединения имени входа и пароля.
Чтобы использовать selectionArgs, вы должны сделать что-то вроде
final String SQL_STATEMENT = "SELECT COUNT(*) FROM users WHERE uname=? AND pwd=?"; private void someMethod() { Cursor c = db.rawQuery(SQL_STATEMENT, new String[] { loginname, loginpass }); ... }
источник
Предполагая, что у вас уже установлено соединение с Database (
db
), я думаю, что самый элегантный способ - придерживатьсяCursor
класса и сделать что-то вроде:источник
как получить столбец подсчета
final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass; int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);
Это наиболее лаконичная и точная альтернатива. Не нужно обрабатывать курсоры и их закрытие.
источник
Если вы используете ContentProvider, вы можете использовать:
источник
Если вы хотите получить количество записей, вам нужно применить группу по какому-либо полю или применить следующий запрос.
подобно
db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
источник
Другой способ - использовать:
на курсоре, например:
Если вы можете подумать об уходе от сырого запроса.
источник
int nombr = 0; Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null); nombr = cursor.getCount();
источник