पंक्तियों को गिनने के लिए Android में SQLite Query


91

मैं एक सरल लॉगिन फॉर्म बनाने की कोशिश कर रहा हूं, जहां मैं लॉगिन आईडी और पासवर्ड की तुलना लॉगिन स्क्रीन पर दर्ज डेटाबेस में संग्रहीत करता हूं।

मैं निम्नलिखित प्रश्न का उपयोग कर रहा हूं:

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

मुद्दा यह है, मुझे नहीं पता, मैं उपरोक्त क्वेरी को कैसे निष्पादित कर सकता हूं और वापस लौटी गणना को संग्रहीत कर सकता हूं।

यहां बताया गया है कि डेटाबेस तालिका कैसी दिखती है (मैंने निष्पादक विधि का उपयोग करके डेटाबेस को सफलतापूर्वक बनाने का प्रयास किया है)

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

क्या कोई कृपया मुझे मार्गदर्शन दे सकता है कि मैं इसे कैसे प्राप्त कर सकता हूं? यदि संभव हो तो उपरोक्त कार्य करने के लिए एक नमूना स्निपेट प्रदान करें।

जवाबों:


121

DatabaseUtils.queryNumEntries (एपी से: 11) उपयोगी विकल्प है जो कच्चे SQL (yay!) की आवश्यकता को नकारता है।

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

OS <11 के लिए, इसे NoSuchMethodError त्रुटि मिलती है, क्या OS <11 का समर्थन करने के लिए कोई कार्य-आस-पास है?
खोबिब

2
@ खाओबीब ने उत्तर दिया कि ग़चिनॉय से जवाब
एडुआर्डो

1
@EduardoHerzer मुझे सीधे कर्सर.getCount () के साथ एक रास्ता मिला।
खोबिब

1
@ खोबैब यह करने का बहुत कुशल तरीका नहीं है। तुम हमेशा का उपयोग कर पसंद करते हैं चाहिए SELECT COUNT(*)और queryNumEntries()सभी रिकॉर्ड को पुन: प्राप्त और देख रहे हैं कि कितने, यानी अधिक। cursor.getCount()
प्रियवोल्ट

114

@scottyab the paramrized DatabaseUtils.queryNumEntries (db, table, जहाँपरम) एपीआई 11 + पर मौजूद है , जिनके बिना एपीआई 1 के बाद से मौजूद है । उत्तर के लिए 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();

मुझे @ Dre का उत्तर भी पसंद है, जिसमें पैरामीटर क्वेरी है।


1
सोच रहे लोगों के लिए, के लिए पैरामीटर mCount.getInt()है columnindex। सहायता के लिए धनयवाद!
T.Woody

62

SQLiteStatement का उपयोग करें ।

जैसे

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

  long count = s.simpleQueryForLong();

1
इस उत्तर के बारे में एक बात मुझे पसंद है @ @ स्कॉटीटैब का उत्तर (जो कि आईएस भी वास्तव में अच्छा है) यह है कि आप इस मामले में लिमट क्लॉज को निर्दिष्ट कर सकते हैं। यह तब उपयोगी होता है जब आप यह जानना चाहते हैं कि क्या तालिका में कोई पंक्तियाँ हैं (उदाहरण के लिए, तालिका 1 से संख्या (गिनती) (*)> 0) बनाम कोई पंक्तियाँ नहीं। मैं अनुमान लगा रहा हूँ कि जब तालिका में कोई पंक्तियाँ या एक टन पंक्तियाँ हो सकती हैं तो मैं तेज़ हो जाऊंगा। यह वह विशिष्ट मामला है, जिसकी मुझे तलाश थी ...
15

@Teknogrebo: यह एक अच्छा जवाब है, हालांकि मैं पैरामीटर किए गए संस्करण का उपयोग करूंगा। आप उपयोग कर सकते हैं ?क्वेरी में रों और उसके बाद का उपयोग bindString(int, String)और bindLong(int, long)मूल्यों को सम्मिलित करने के। देखें यहाँ
प्रियवोल्ट

22

देखें rawQuery (स्ट्रिंग, स्ट्रिंग []) और के लिए दस्तावेज़ कर्सर

आपका DADABASE_COMPARE SQL कथन वर्तमान में अमान्य है, loginnameऔर loginpassबच नहीं जाएगा, loginnameऔर बीच में कोई स्थान नहीं है and, और आप कथन को समाप्त करते हैं); के बजाय ; - यदि आप पासवर्ड के पासवर्ड के साथ बॉब के रूप में लॉग इन कर रहे थे, तो वह विवरण समाप्त हो जाएगा

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

इसके अलावा, आपको शायद लॉगिननाम और लॉगिनपास के स्थान के बजाय चयन सुविधा का उपयोग करना चाहिए।

SelectionArgs का उपयोग करने के लिए आप कुछ ऐसा करेंगे

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

यह मानते हुए कि आपके पास पहले से ही एक डेटाबेस ( db) कनेक्शन स्थापित है, मुझे लगता है कि सबसे सुंदर तरीका Cursorकक्षा से चिपकना है, और कुछ ऐसा करना है:

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
आपको कम से कम एक कॉलम निर्दिष्ट करना चाहिए। पासिंग नल सभी कॉलमों को वापस कर देगा, जो कि डेटा को पढ़ने के लिए स्टोरेज से रोकने के लिए हतोत्साहित करता है जिसका उपयोग नहीं किया जा रहा है। #perfmatters
redochka

वास्तव में यदि आवश्यक जानकारी केवल एक गिनती है, तो एकल कॉलम (उदाहरण के लिए आईडी) प्राप्त करना पर्याप्त से अधिक होगा
एलोई नवारो

12

गणना कॉलम कैसे प्राप्त करें

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

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

यह सबसे संक्षिप्त और सटीक विकल्प है। अभिशापों और उनके समापन को संभालने की आवश्यकता नहीं है।


अद्भुत - हमेशा से Android के साथ काम कर रहा था और कभी भी इस डेटाबेस के बारे में नहीं जानता था - Google को वहाँ के बर्तनों को बढ़ावा देने के लिए बेहतर होना चाहिए ...
slott

6

यदि आप ContentProvider उपयोग कर रहे हैं तो आप उपयोग कर सकते हैं:

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

5

एक और तरीका होगा:

myCursor.getCount();

एक कर्सर पर जैसे:

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

यदि आप कच्ची क्वेरी से दूर होने के बारे में सोच सकते हैं।


5

यदि आप अभिलेखों की गिनती प्राप्त करना चाहते हैं तो आपको समूह को किसी क्षेत्र पर लागू करना होगा या नीचे की क्वेरी को लागू करना होगा।

पसंद

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.