Хобрук: Ваш путь к мастерству в программировании

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

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

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

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

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

05.03.2011

Ответы:


1

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

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

  • 2

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

    18.01.2012
  • Для тех, кому интересно, параметр для mCount.getInt() равен columnindex. Спасибо вам за помощь! 04.08.2018

  • 3

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

    e.g.

     SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );
    
      long count = s.simpleQueryForLong();
    
    21.03.2011
  • Что мне нравится в этом ответе по сравнению с ответом @scottyab (который также действительно хорош), так это то, что в этом случае вы можете указать предложение LIMIT. Это полезно, когда вы просто хотите узнать, есть ли в таблице КАКИЕ-ЛИБО строки (например, выберите (count(*) › 0) из TABLE LIMIT 1) или нет строк. Я предполагаю, что это будет быстрее, когда в таблице может не быть строк или тонна строк. Это конкретный случай, который у меня был, когда я искал это... 29.09.2016
  • @Teknogrebo: это хороший ответ, хотя я бы использовал параметризованную версию. Вы можете использовать ?s в запросе, а затем использовать bindString(int, String) и bindLong(int, long) для вставки значений. См. здесь. 13.07.2017

  • 4

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

    Ваш 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 });
        ...
    }
    
    05.03.2011

    5

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

  • 6

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

    final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;
    
    int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);
    

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

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

  • 7

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

    Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
                uname=" + loginname + " and pwd=" + loginpass, null, null);
        cursor.moveToFirst();
        int count = cursor.getInt(0);
    
    14.02.2014

    8

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

    Нравиться

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

    9

    Другим способом будет использование:

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

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

    18.06.2013
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..