Satırları saymak için Android'de SQLite Sorgusu


92

Basit bir Giriş formu oluşturmaya çalışıyorum, burada giriş ekranına girilen giriş kimliği ve şifresini veritabanında kayıtlı olanla karşılaştırıyorum.

Aşağıdaki sorguyu kullanıyorum:

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

Sorun şu ki, yukarıdaki sorguyu nasıl çalıştırabilirim ve döndürülen sayımı nasıl saklayabilirim.

Veritabanı tablosu şöyle görünüyor (veritabanını execSQl yöntemini kullanarak başarıyla oluşturmayı başardım)

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

Bunu nasıl başarabileceğim konusunda biri bana nazikçe rehberlik edebilir mi? Mümkünse, yukarıdaki görevi yapmak için lütfen bir örnek pasaj sağlayın.

Yanıtlar:


123

DatabaseUtils.queryNumEntries (api: 11'den beri), ham SQL (yay!) İhtiyacını ortadan kaldıran kullanışlı bir alternatiftir.

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});

OS <11 için, NoSuchMethodError hatası alıyor, OS <11'i desteklemek için herhangi bir çözüm var mı?
Khobaib

2
@Khobaib Ghchinoy'un cevabını kontrol et
Eduardo Herzer

1
@EduardoHerzer cursor.getCount () ile doğrudan bir yol buldum.
Khobaib

1
@Khobaib Bu, bunu yapmanın çok verimli bir yolu değil. Her zaman tüm kayıtları kullanmayı SELECT COUNT(*)ve queryNumEntries()almayı ve kaç tane olduğunu görmeyi tercih etmelisiniz , yani. cursor.getCount()
DearVolt

115

@scottyab parametrize DatabaseUtils.queryNumEntries (db, table, whereparams) API 11 + 'da var, API 1'den beri paramsız olan . Cevap, db.rawQuery ile bir İmleç oluşturmak olmalıdır:

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

Parametreli sorgu ile @ Dre'nin cevabını da beğeniyorum.


1
Merak edenler için parametresi mCount.getInt()şudur columnindex. Yardım için teşekkürler!
T.Woody

62

Bir SQLiteStatement .

Örneğin

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

  long count = s.simpleQueryForLong();

1
Bu cevaba karşı @ scottyab'ın cevabıyla ilgili sevdiğim bir şey (ki bu da gerçekten iyi) bu durumda bir LIMIT cümlesi belirtebilmenizdir. Bu, bir tabloda HERHANGİ satır olup olmadığını bilmek istediğinizde (örneğin, TABLO SINIRI 1'den (sayım (*)> 0) seçin) ve hiç satır olmadığını bilmek istediğinizde yararlıdır. Tabloda hiç satır veya tonlarca satır olmadığında bunun daha hızlı olacağını tahmin ediyorum. Bunu ararken karşılaştığım özel durum
buydu

@Teknogrebo: Parametreli versiyonu kullansam da bu güzel bir cevap. Sen kullanabilirsiniz ?kullanmak sonra sorguda s ve bindString(int, String)ve bindLong(int, long)değerlerini ekleyin. Buraya bakın .
DearVolt

23

Bkz rawQuery (String, String []) ve belgelerine İmleç

DADABASE_COMPARE SQL deyiminiz şu anda geçersiz loginnameve loginpassöncelenmeyecek, loginnameve arasında boşluk yok ve anddeyimi) ile sonlandırıyorsunuz; onun yerine ; - Bob olarak şifre şifresiyle giriş yapıyorsanız, bu ifade şu şekilde sonuçlanacaktır:

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

Ayrıca, loginname ve loginpass'i birleştirmek yerine muhtemelen selectionArgs özelliğini kullanmalısınız.

SelectionArgs kullanmak için şöyle bir şey yaparsınız:

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

Zaten bir Veritabanı ( db) bağlantınız olduğunu varsayarsak , bence en şık yol Cursorsınıfa bağlı kalmak ve şöyle bir şey yapmak:

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
En azından bir sütun belirtmelisiniz. Null değerinin aktarılması tüm sütunları döndürür; bu, kullanılmayacak olan verilerin depodan okunmasını önlemek için önerilmez. #perfmatters
redochka

Aslında, gerekli bilgi yalnızca bir sayı ise, tek bir sütunu (örneğin kimlik) almak fazlasıyla yeterli olacaktır
Eloi Navarro

12

sayma sütunu nasıl alınır

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

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

Bu, en özlü ve kesin alternatiftir. İmleçleri ve kapanışlarını ele almaya gerek yok.


Şaşırtıcı - sonsuza beri Android ile çalışan ve bu DatabaseUtils hakkında bilmiyordum edilmiş - Google daha iyi orada utils'i teşvik olmalıdır ...
slott

6

ContentProvider kullanıyorsanız şunları kullanabilirsiniz:

Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
            uname=" + loginname + " and pwd=" + loginpass, null, null);
    cursor.moveToFirst();
    int count = cursor.getInt(0);

6

Kayıt sayısını almak istiyorsanız, grubu bir alana uygulamanız veya aşağıdaki sorguyu uygulamanız gerekir.

Sevmek

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

5

Başka bir yol kullanmak olabilir:

myCursor.getCount();

İmleçte şunun gibi:

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

Ham sorgudan uzaklaşmayı düşünebilirseniz.


1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.