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.

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

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.


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

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 });
    ...
}

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;

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.


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

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

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.


1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.