SQLite-Abfrage in Android zum Zählen von Zeilen

91

Ich versuche, ein einfaches Anmeldeformular zu erstellen, in dem ich die auf dem Anmeldebildschirm eingegebene Anmelde-ID und das Kennwort mit der in der Datenbank gespeicherten vergleiche.

Ich verwende die folgende Abfrage:

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

Das Problem ist, ich weiß nicht, wie ich die obige Abfrage ausführen und die zurückgegebene Anzahl speichern kann.

So sieht die Datenbanktabelle aus (ich habe es geschafft, die Datenbank erfolgreich mit der execSQl-Methode zu erstellen).

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

Kann mich jemand freundlich anleiten, wie ich dies erreichen kann? Wenn möglich, stellen Sie bitte ein Beispiel-Snippet zur Verfügung, um die oben genannte Aufgabe auszuführen.

arun
quelle

Antworten:

121

DatabaseUtils.queryNumEntries (seit api: 11) ist eine nützliche Alternative, die die Notwendigkeit von Raw-SQL negiert (yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
Scottyab
quelle
Für OS <11 wird der NoSuchMethodError-Fehler angezeigt. Gibt es eine Problemumgehung für OS <11?
Khobaib
2
@ Khobaib Überprüfen Sie die Antwort von Ghchinoy
Eduardo Herzer
1
@EduardoHerzer Ich habe einen Weg mit cursor.getCount () direkt gefunden.
Khobaib
1
@ Khobaib Das ist keine sehr effiziente Methode. Sie sollten es immer vorziehen , alle Datensätze zu verwenden SELECT COUNT(*)und nicht queryNumEntries()abzurufen und zu sehen, wie viele es gibt, d. H. cursor.getCount()
DearVolt
114

@scottyab Die parametrisierten DatabaseUtils.queryNumEntries (db, table, whereparams) sind in API 11 + vorhanden, die ohne die whereparams seit API 1 . Die Antwort müsste darin bestehen, einen Cursor mit einer db.rawQuery zu erstellen:

Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null);
mCount.moveToFirst();
int count= mCount.getInt(0);
mCount.close();

Ich mag auch die Antwort von @ Dre mit der parametrisierten Abfrage.

Ghchinoy
quelle
1
Für diejenigen fragen, für den Parameter mCount.getInt()ist columnindex. Danke für die Hilfe!
T. Woody
62

Verwenden Sie ein SQLiteStatement .

z.B

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

  long count = s.simpleQueryForLong();
Teknogrebo
quelle
1
Eine Sache, die ich an dieser Antwort gegenüber der Antwort von @ scottyab mag (die auch wirklich gut ist), ist, dass Sie in diesem Fall eine LIMIT-Klausel angeben können. Dies ist nützlich, wenn Sie nur wissen möchten, ob eine Tabelle ANY Zeilen enthält (z. B. select (count (*)> 0) aus TABLE LIMIT 1) und keine Zeilen. Ich vermute, das wird schneller, wenn die Tabelle keine Zeilen oder eine Tonne Zeilen enthalten könnte. Dies ist der spezielle Fall, den ich hatte, als ich danach suchte ...
stecken
@ Teknogrebo: Dies ist eine schöne Antwort, obwohl ich die parametrisierte Version verwenden würde. Sie können ?s in der Abfrage verwenden und dann bindString(int, String)und verwenden bindLong(int, long), um die Werte einzufügen. Siehe hier .
DearVolt
22

Siehe rawQuery (String, String []) und die Dokumentation zu Cursor

Ihre SQL-Anweisung DADABASE_COMPARE ist derzeit ungültig loginnameund loginpasswird nicht maskiert. Zwischen loginnameund steht kein Leerzeichen and, und Sie beenden die Anweisung mit). anstatt ; - Wenn Sie sich als Bob mit dem Passwort des Passworts anmelden würden, würde diese Anweisung als enden

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

Außerdem sollten Sie wahrscheinlich die Funktion selectionArgs verwenden, anstatt Loginname und Loginpass zu verketten.

Um selectionArgs zu verwenden, würden Sie so etwas tun

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

Angenommen, Sie haben bereits eine Database ( db) -Verbindung hergestellt, ist es meiner Meinung nach am elegantesten, sich an die CursorKlasse zu halten und Folgendes zu tun:

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
quelle
2
Sie sollten mindestens eine Spalte angeben. Wenn Sie null übergeben, werden alle Spalten zurückgegeben. Dies wird nicht empfohlen, um zu verhindern, dass Daten aus dem Speicher gelesen werden, der nicht verwendet wird. #perfmatters
Redochka
In der Tat, wenn die erforderlichen Informationen nur eine Zählung sind, wäre das Abrufen einer einzelnen Spalte (z. B. ID) mehr als genug
Eloi Navarro
12

wie man eine Zählspalte bekommt

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

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

Dies ist die prägnanteste und präziseste Alternative. Keine Notwendigkeit, Cursor und deren Schließen zu behandeln.

Kontinuität
quelle
Erstaunlich - arbeite seit Ewigkeiten mit Android und wusste nie über diese DatabaseUtils Bescheid - Google sollte besser darin sein, dort Utils zu bewerben ...
Slott
6

Wenn Sie ContentProvider verwenden, können Sie Folgendes verwenden:

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
quelle
5

Ein anderer Weg wäre:

myCursor.getCount();

auf einem Cursor wie:

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

Wenn Sie daran denken können, von der Rohabfrage wegzukommen.

Jochen Reinschlüssel
quelle
5

Wenn Sie die Anzahl der Datensätze erhalten möchten, müssen Sie die Gruppe in einem bestimmten Feld anwenden oder die folgende Abfrage anwenden.

Mögen

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