Zapytanie SQLite w systemie Android do liczenia wierszy

92

Próbuję stworzyć prosty formularz logowania, w którym porównuję identyfikator logowania i hasło wprowadzone na ekranie logowania z tymi przechowywanymi w bazie danych.

Używam następującego zapytania:

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

Problem w tym, że nie wiem, jak mogę wykonać powyższe zapytanie i zapisać zwróconą liczbę.

Oto jak wygląda tabela bazy danych (udało mi się pomyślnie utworzyć bazę danych przy użyciu metody 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);";

Czy ktoś może mi uprzejmie wskazać, jak mogę to osiągnąć? Jeśli to możliwe, podaj przykładowy fragment kodu, aby wykonać powyższe zadanie.

bieg
źródło

Odpowiedzi:

122

DatabaseUtils.queryNumEntries (od api: 11) jest użyteczną alternatywą, która eliminuje potrzebę używania surowego SQL (yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
scottyab
źródło
dla systemu operacyjnego <11, pojawia się błąd NoSuchMethodError, czy jest jakieś obejście dla obsługi systemu operacyjnego <11?
Khobaib
2
@Khobaib Sprawdź odpowiedź od ghchinoy
Eduardo Herzer
1
@EduardoHerzer Znalazłem sposób bezpośrednio za pomocą kursora.getCount ().
Khobaib
1
@Khobaib To niezbyt efektywny sposób na zrobienie tego. Zawsze powinieneś preferować używanie SELECT COUNT(*)i queryNumEntries()pobieranie wszystkich rekordów i sprawdzanie, ile ich jest, tj. cursor.getCount()
DearVolt,
115

@scottyab parametrized DatabaseUtils.queryNumEntries (db, table, whereparams) istnieje w API 11 +, ten bez whereparams istnieje od API 1 . Odpowiedzią byłoby utworzenie kursora z 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();

Podoba mi się również odpowiedź @ Dre z zapytaniem sparametryzowanym.

ghchinoy
źródło
1
Dla tych, którzy się zastanawiają, parametr for mCount.getInt()is columnindex. Dziękuję za pomoc!
T.Woody
62

Użyj SQLiteStatement .

na przykład

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

  long count = s.simpleQueryForLong();
Teknogrebo
źródło
1
Jedną z rzeczy, które lubię w tej odpowiedzi w porównaniu z odpowiedzią @ scottyab (która jest również bardzo dobra) jest to, że w tym przypadku możesz określić klauzulę LIMIT. Jest to przydatne, gdy chcesz tylko wiedzieć, czy w tabeli są JAKIEKOLWIEK wiersze (np. Wybierz (count (*)> 0) z TABLE LIMIT 1) czy nie. Zgaduję, że będzie to szybsze, gdy tabela nie będzie zawierać wierszy lub ich mnóstwo. To jest konkretny przypadek, który miałem, szukając tego ...
stuckj
@Teknogrebo: To dobra odpowiedź, chociaż użyłbym wersji sparametryzowanej. Możesz użyć ?s w zapytaniu, a następnie użyć bindString(int, String)i, bindLong(int, long)aby wstawić wartości. Zobacz tutaj .
DearVolt,
23

Zobacz rawQuery (String, String []) i dokumentację Cursor

Twoja instrukcja SQL DADABASE_COMPARE jest obecnie niepoprawna loginnamei loginpassnie zostanie zmieniona , nie ma spacji między loginnamei and, i kończysz instrukcję ); zamiast ; - Jeśli logujesz się jako bob za pomocą hasła lub hasła, to stwierdzenie zakończy się jako

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

Powinieneś także prawdopodobnie użyć funkcji selectionArgs, zamiast łączyć login i loginpass.

Aby użyć selectionArgs, zrobiłbyś coś takiego

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
źródło
22

Zakładając, że masz już dbustanowione połączenie z bazą danych ( ), myślę, że najbardziej eleganckim sposobem jest trzymanie się Cursorklasy i zrobienie czegoś takiego:

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
źródło
2
Powinieneś przynajmniej określić kolumnę. Przekazanie wartości null zwróci wszystkie kolumny, co jest niezalecane, aby zapobiec odczytaniu danych z pamięci, które nie będą używane. #perfmatters
redochka
W rzeczywistości, jeśli niezbędne informacje są tylko liczbą, pobranie pojedynczej kolumny (na przykład identyfikatora) byłoby więcej niż wystarczające
Eloi Navarro
12

jak zdobyć kolumnę zliczania

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

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

To najbardziej zwięzła i precyzyjna alternatywa. Nie ma potrzeby obsługi kursorów i ich zamykania.

ciągłość
źródło
Niesamowite - pracuję z Androidem od zawsze i nigdy nie wiedziałem o tym DatabaseUtils - Google powinien być lepszy w promowaniu tam narzędzi ...
slott
6

Jeśli używasz ContentProvider, możesz użyć:

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
źródło
6

Jeśli chcesz uzyskać liczbę rekordów, musisz zastosować grupę według jakiegoś pola lub zastosować poniższe zapytanie.

Lubić

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
Chirag
źródło
5

Innym sposobem byłoby użycie:

myCursor.getCount();

na Kursorze, jak:

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

Jeśli możesz pomyśleć o wyjściu z nieprzetworzonego zapytania.

Jochen Reinschlüssel
źródło
1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Antoine Luckenson
źródło