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

81

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

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

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

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

Теги:
count

9 ответов

102

@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 . Спасибо вам за помощь!
101

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

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
  • 0
    для OS <11 возникает ошибка NoSuchMethodError, есть ли обходной путь для поддержки OS <11?
  • 2
    @Khobaib Проверь ответ от гхиной
Показать ещё 2 комментария
65

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

например.

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

  long count = s.simpleQueryForLong();
  • 1
    Что мне нравится в этом ответе против ответа @ scottyab (что тоже очень хорошо), так это то, что в этом случае вы можете указать предложение LIMIT. Это полезно, когда вы просто хотите узнать, есть ли в таблице какие-либо строки (например, выберите (count (*)> 0) из TABLE LIMIT 1), а не строк. Я предполагаю, что это будет быстрее, когда в таблице не может быть строк или тонны строк. Это особый случай, который я имел при поиске этого ...
  • 0
    @Teknogrebo: Это хороший ответ, хотя я бы использовал параметризованную версию. Вы можете использовать ? s в запросе, а затем используйте bindString(int, String) и bindLong(int, long) для вставки значений. Смотрите здесь .
21

См. rawQuery (String, String []) и документация для Cursor

Ваша инструкция DADABASE_COMPARE SQL в настоящее время недействительна, loginname и loginpass не будут экранированы, между loginname и and нет пробела, и вы заканчиваете утверждение); вместо; - Если вы вошли в систему как bob с паролем пароля, это утверждение закончилось бы как

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 });
    ...
}
19

Предполагая, что у вас уже установлено соединение с базой данных (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
    Вы должны по крайней мере указать столбец. Передача нулевого значения вернет все столбцы, что не рекомендуется для предотвращения чтения данных из хранилища, которое не будет использоваться. #perfmatters
  • 0
    На самом деле, если необходимая информация представляет собой только счет, выбор одного столбца (например, идентификатора) будет более чем достаточно
12

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

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

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

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

  • 0
    Удивительно - работаю с Android с незапамятных времен и никогда не знал об этом DatabaseUtils - Google должен лучше продвигать свои утилиты ...
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);
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);

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

5

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

Как

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню