SQLite Query в Android для подсчета строк

92

Я пытаюсь создать простую форму входа в систему, в которой я сравниваю идентификатор входа и пароль, введенные на экране входа в систему, с данными, хранящимися в базе данных.

Я использую следующий запрос:

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);";

Может ли кто-нибудь посоветовать мне, как я могу этого добиться? Если возможно, предоставьте образец фрагмента для выполнения вышеуказанной задачи.

Арун
источник

Ответы:

122

DatabaseUtils.queryNumEntries (начиная с api: 11) - полезная альтернатива, которая устраняет необходимость в необработанном SQL (ура!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
Скоттиаб
источник
для ОС <11 возникает ошибка NoSuchMethodError, есть ли способ поддержки для ОС <11?
Хобаиб
2
@Khobaib Проверьте ответ от ghchinoy
Эдуардо Герцер
1
@EduardoHerzer Я нашел способ напрямую с cursor.getCount ().
Хобаиб
1
@Khobaib Это не очень эффективный способ сделать это. Вы всегда должны предпочесть использовать SELECT COUNT(*)и queryNumEntries()извлекать все записи и видеть, сколько их, т.е. cursor.getCount()
DearVolt
115

@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 с параметризованным запросом.

гчиной
источник
1
Для тех , кому интересно, то параметр mCount.getInt()является columnindex. Спасибо вам за помощь!
T.Woody 04
62

Используйте SQLiteStatement .

например

 SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );

  long count = s.simpleQueryForLong();
Текногребо
источник
1
Одна вещь, которая мне нравится в этом ответе против ответа @scottyab (который тоже действительно хорош), заключается в том, что в этом случае вы можете указать предложение LIMIT. Это полезно, когда вы просто хотите знать, есть ли ЛЮБЫЕ строки в таблице (например, выберите (count (*)> 0) from TABLE LIMIT 1) или нет строк. Я предполагаю, что это будет быстрее, если в таблице не может быть строк или тонны строк. Это конкретный случай, который у меня был при поиске этого ...
stuckj
@Teknogrebo: это хороший ответ, хотя я бы использовал параметризованную версию. Вы можете использовать ?s в запросе, а затем использовать bindString(int, String)и bindLong(int, long)для вставки значений. Смотрите здесь .
DearVolt
23

См. 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 });
    ...
}
Dre
источник
22

Предполагая, что у вас уже установлено соединение с Database ( db), я думаю, что самый элегантный способ - придерживаться Cursorкласса и сделать что-то вроде:

String selection = "uname = ? AND pwd = ?";
String[] selectionArgs = {loginname, loginpass};
String tableName = "YourTable";
Cursor c = db.query(tableName, null, selection, selectionArgs, null, null, null);
int result = c.getCount();
c.close();
return result;
Элои Наварро
источник
2
Вы должны хотя бы указать столбец. Передача null вернет все столбцы, что не рекомендуется для предотвращения чтения данных из хранилища, которое не будет использоваться. #perfmatters
редочка
Фактически, если необходимая информация - это только счетчик, получение одного столбца (например, ID) было бы более чем достаточно
Элои Наварро
12

как получить столбец подсчета

final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;

int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);

Это наиболее лаконичная и точная альтернатива. Не нужно обрабатывать курсоры и их закрытие.

непрерывность
источник
Удивительно - я работал с Android с незапамятных времен и никогда не знал об этом DatabaseUtils - Google должен лучше продвигать эти утилиты ...
slott
6

Если вы используете ContentProvider, вы можете использовать:

Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
            uname=" + loginname + " and pwd=" + loginpass, null, null);
    cursor.moveToFirst();
    int count = cursor.getInt(0);
Бешой Файез
источник
6

Если вы хотите получить количество записей, вам нужно применить группу по какому-либо полю или применить следующий запрос.

подобно

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
Чираг
источник
5

Другой способ - использовать:

myCursor.getCount();

на курсоре, например:

Cursor myCursor = db.query(table_Name, new String[] { row_Username }, 
row_Username + " =? AND " + row_Password + " =?",
new String[] { entered_Password, entered_Password }, 
null, null, null);

Если вы можете подумать об уходе от сырого запроса.

Йохен Райншлюссель
источник
1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Антуан Лакенсон
источник