Consulta SQLite no Android para contar linhas

91

Estou tentando criar um formulário de Login simples, onde comparo o id de login e a senha inseridos na tela de login com os armazenados no banco de dados.

Estou usando a seguinte consulta:

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

A questão é, não sei, como posso executar a consulta acima e armazenar a contagem retornada.

É assim que a tabela do banco de dados se parece (eu consegui criar o banco de dados com sucesso usando o método 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);";

Alguém pode gentilmente me orientar sobre como posso conseguir isso? Se possível, forneça um snippet de amostra para fazer a tarefa acima.

uma corrida
fonte

Respostas:

121

DatabaseUtils.queryNumEntries (desde api: 11) é uma alternativa útil que nega a necessidade de SQL bruto (yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
scottyab
fonte
para OS <11, obtém o erro NoSuchMethodError. Existe alguma solução alternativa para oferecer suporte para OS <11?
Khobaib
2
@Khobaib Verifique a resposta de ghchinoy
Eduardo Herzer
1
@EduardoHerzer Eu encontrei um jeito com cursor.getCount () diretamente.
Khobaib 01 de
1
@Khobaib Essa não é uma maneira muito eficiente de fazer isso. Você deve sempre preferir usar SELECT COUNT(*)e queryNumEntries()recuperar todos os registros e ver quantos existem, ou seja, cursor.getCount()
DearVolt
114

@scottyab o DatabaseUtils.queryNumEntries parametrizado (db, table, whereparams) existe na API 11 +, aquele sem o whereparams existe desde a API 1 . A resposta teria que ser criar um Cursor com um 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();

Também gosto da resposta do @Dre, com a consulta parametrizada.

ghchinoy
fonte
1
Para quem está se perguntando, o parâmetro para mCount.getInt()é columnindex. Obrigado pela ajuda!
T.Woody
62

Use um SQLiteStatement .

por exemplo

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

  long count = s.simpleQueryForLong();
Teknogrebo
fonte
1
Uma coisa que eu gosto sobre esta resposta vs a resposta de @scottyab (que também é muito boa) é que você pode especificar uma cláusula LIMIT neste caso. Isso é útil quando você deseja apenas saber se há QUALQUER linha em uma tabela (por exemplo, selecione (contagem (*)> 0) do LIMITE DA TABELA 1) vs nenhuma linha. Estou supondo que será mais rápido quando a tabela não tiver linhas ou muitas linhas. Este é o caso específico que tive ao pesquisar este ...
presoj
@Teknogrebo: Esta é uma boa resposta, embora eu usasse a versão parametrizada. Você pode usar ?s na consulta e, em seguida, usar bindString(int, String)e bindLong(int, long)para inserir os valores. Veja aqui .
DearVolt
22

Veja rawQuery (String, String []) e a documentação do Cursor

Sua instrução SQL DADABASE_COMPARE é atualmente inválida loginnamee loginpassnão terá escape, não há espaço entre loginnamee and, e você termina a instrução com); ao invés de ; - Se você estivesse fazendo login como bob com a senha password, essa declaração terminaria como

select count(*) from users where uname=boband pwd=password);

Além disso, você provavelmente deve usar o recurso selectionArgs, em vez de concatenar nome de login e senha de login.

Para usar selectionArgs, você faria algo como

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
fonte
22

Supondo que você já tenha uma dbconexão Database ( ) estabelecida, acho que a maneira mais elegante é manter a Cursorclasse e fazer algo como:

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;
Eloi Navarro
fonte
2
Você deve pelo menos especificar uma coluna. A passagem de null retornará todas as colunas, o que é desencorajado para evitar a leitura de dados de armazenamento que não serão usados. #perfmatters
redochka
Na verdade, se a informação necessária for apenas uma contagem, recuperar uma única coluna (ID, por exemplo) seria mais do que suficiente
Eloi Navarro
12

como obter coluna de contagem

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

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

Esta é a alternativa mais concisa e precisa. Não há necessidade de manipular cursores e seu fechamento.

kontinuidade
fonte
Incrível - trabalho com Android desde sempre e nunca soube desse DatabaseUtils - o Google deveria ser melhor na promoção de seus utils ...
slott
6

Se você estiver usando ContentProvider, poderá usar:

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

Outra maneira seria usar:

myCursor.getCount();

em um Cursor como:

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

Se você puder pensar em fugir da consulta bruta.

Jochen Reinschlüssel
fonte
5

Se você deseja obter a contagem de registros, deve aplicar o grupo por em algum campo ou aplicar a consulta abaixo.

Gostar

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
Chirag
fonte
1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Antoine Luckenson
fonte