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.
SELECT COUNT(*)
iqueryNumEntries()
pobieranie wszystkich rekordów i sprawdzanie, ile ich jest, tj.cursor.getCount()
@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.
źródło
mCount.getInt()
iscolumnindex
. Dziękuję za pomoc!Użyj SQLiteStatement .
na przykład
SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " ); long count = s.simpleQueryForLong();
źródło
?
s w zapytaniu, a następnie użyćbindString(int, String)
i,bindLong(int, long)
aby wstawić wartości. Zobacz tutaj .Zobacz rawQuery (String, String []) i dokumentację Cursor
Twoja instrukcja SQL DADABASE_COMPARE jest obecnie niepoprawna
loginname
iloginpass
nie zostanie zmieniona , nie ma spacji międzyloginname
iand
, i kończysz instrukcję ); zamiast ; - Jeśli logujesz się jako bob za pomocą hasła lub hasła, to stwierdzenie zakończy się jakoselect 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 }); ... }
źródło
Zakładając, że masz już
db
ustanowione połączenie z bazą danych ( ), myślę, że najbardziej eleganckim sposobem jest trzymanie sięCursor
klasy i zrobienie czegoś takiego:źródło
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.
źródło
Jeśli używasz ContentProvider, możesz użyć:
źródło
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);
źródło
Innym sposobem byłoby użycie:
na Kursorze, jak:
Jeśli możesz pomyśleć o wyjściu z nieprzetworzonego zapytania.
źródło
int nombr = 0; Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null); nombr = cursor.getCount();
źródło