Kueri SQLite di Android untuk menghitung baris

92

Saya mencoba membuat formulir Login sederhana, di mana saya membandingkan id login dan kata sandi yang dimasukkan di layar login dengan yang disimpan di database.

Saya menggunakan kueri berikut:

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

Masalahnya adalah, saya tidak tahu, bagaimana saya bisa menjalankan kueri di atas dan menyimpan hitungan yang dikembalikan.

Berikut tampilan tabel database (saya berhasil membuat database dengan sukses menggunakan metode 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);";

Dapatkah seseorang dengan baik hati membimbing saya tentang bagaimana saya dapat mencapai ini? Jika memungkinkan, berikan cuplikan contoh untuk melakukan tugas di atas.

arun
sumber

Jawaban:

122

DatabaseUtils.queryNumEntries (karena api: 11) adalah alternatif yang berguna yang meniadakan kebutuhan akan SQL mentah (yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
scottyab
sumber
untuk OS <11, ia mendapat kesalahan NoSuchMethodError, apakah ada solusi untuk mendukung OS <11?
Khobaib
2
@Koboboblog Periksa jawaban dari ghinoy
Eduardo Herzer
1
@EduardoHerzer Saya menemukan cara dengan cursor.getCount () secara langsung.
Khobaib
1
@Kobob Itu bukan cara yang sangat efisien untuk melakukannya. Anda harus selalu lebih suka menggunakan SELECT COUNT(*)dan queryNumEntries()daripada mengambil semua catatan dan melihat berapa banyak yang ada, yaitu. cursor.getCount()
DearVolt
115

@scottyab parametrized DatabaseUtils.queryNumEntries (db, table, whereparams) ada di API 11 +, yang tanpa whereparams ada sejak API 1 . Jawabannya harus membuat Cursor dengan 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();

Saya juga menyukai jawaban @ Dre, dengan kueri berparameter.

ghchinoy.dll
sumber
1
Bagi mereka yang bertanya-tanya, parameternya mCount.getInt()adalah columnindex. Terima kasih atas bantuannya!
T. Woody
62

Gunakan SQLiteStatement .

misalnya

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

  long count = s.simpleQueryForLong();
Teknogrebo
sumber
1
Satu hal yang saya suka tentang jawaban ini vs jawaban @ scottyab (yang juga sangat bagus) adalah Anda dapat menentukan klausa LIMIT dalam kasus ini. Ini berguna ketika Anda hanya ingin mengetahui apakah ada baris APA PUN dalam tabel (misalnya, pilih (hitung (*)> 0) dari BATAS TABEL 1) vs tidak ada baris. Saya menduga itu akan lebih cepat ketika tabel tidak memiliki baris atau banyak baris. Ini adalah kasus khusus yang saya alami saat mencari ini ...
stuckj
@Teknogrebo: Ini adalah jawaban yang bagus, meskipun saya akan menggunakan versi berparameter. Anda dapat menggunakan ?s dalam kueri lalu menggunakan bindString(int, String)dan bindLong(int, long)untuk menyisipkan nilai. Lihat disini .
DearVolt
23

Lihat rawQuery (String, String []) dan dokumentasi untuk Cursor

Pernyataan DADABASE_COMPARE SQL Anda saat ini tidak valid, loginnamedan loginpasstidak akan di-escape, tidak ada spasi antara loginnamedan and, dan Anda mengakhiri pernyataan dengan); dari pada ; - Jika Anda masuk sebagai bob dengan kata sandi kata sandi, pernyataan itu akan berakhir sebagai

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

Selain itu, Anda mungkin harus menggunakan fitur selectionArgs, daripada menggabungkan nama login dan loginpass.

Untuk menggunakan selectionArgs, Anda harus melakukan sesuatu seperti

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

Dengan asumsi Anda sudah memiliki dbkoneksi Database ( ), menurut saya cara paling elegan adalah tetap menggunakan Cursorkelas, dan melakukan sesuatu seperti:

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
sumber
2
Anda setidaknya harus menentukan kolom. Meneruskan null akan mengembalikan semua kolom, yang tidak disarankan untuk mencegah pembacaan data dari penyimpanan yang tidak akan digunakan. #perfmatters
redochka
Faktanya jika info yang diperlukan hanya hitungan, mengambil satu kolom (ID misalnya) akan lebih dari cukup
Eloi Navarro
12

cara mendapatkan kolom hitung

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

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

Ini alternatif paling ringkas dan tepat. Tidak perlu menangani kursor dan penutupnya.

kontinuity
sumber
Luar biasa - telah bekerja dengan Android sejak lama dan tidak pernah tahu tentang DatabaseUtils ini - Google seharusnya lebih baik dalam mempromosikan utilitas di sana ...
slott
6

Jika Anda menggunakan ContentProvider, Anda dapat menggunakan:

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
sumber
6

Jika Anda ingin mendapatkan jumlah record maka Anda harus menerapkan grup pada beberapa bidang atau menerapkan kueri di bawah ini.

Suka

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

Cara lain akan menggunakan:

myCursor.getCount();

pada kursor seperti:

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

Jika Anda bisa berpikir untuk menjauh dari kueri mentah.

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