SQLiteDatabase.query विधि


121

मैं SQLiteDatabase की क्वेरी विधि का उपयोग कर रहा हूँ। मैं क्वेरी विधि का उपयोग कैसे करूँ?

मैंने यह कोशिश की:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns - कॉलम पैरामीटर का निर्माण निम्नानुसार किया जाता है।

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

यदि हमें सभी फ़ील्ड प्राप्त करने की आवश्यकता है, तो कॉलम पैरामीटर का निर्माण कैसे किया जाना चाहिए। क्या हमें स्ट्रिंग फ़ील्ड में सभी फ़ील्ड नामों को शामिल करने की आवश्यकता है?

मैं क्वेरी विधि का ठीक से उपयोग कैसे करूं?



मुझे वह तरीका पता है। लेकिन मैं यह जानने की कोशिश कर रहा हूं कि रॉकी के बजाय क्वेरी पद्धति को कैसे लागू किया जाए।
sree_iphonedev

जवाबों:


244

tableColumns

  • null के रूप में सभी स्तंभों के लिए SELECT * FROM ...
  • new String[] { "column1", "column2", ... }विशिष्ट कॉलम के लिए जैसे SELECT column1, column2 FROM ...- आप यहां जटिल अभिव्यक्ति भी रख सकते हैं:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }आपको maxअधिकतम मूल्य रखने वाले एक कॉलम का नाम देगाcolumn1

कहां कारण

  • WHEREउस कीवर्ड के बिना आपके द्वारा डाला गया हिस्सा , जैसे"column1 > 5"
  • उन ?चीजों के लिए शामिल होना चाहिए जो गतिशील हैं, जैसे "column1=?"-> देखेंwhereArgs

whereArgs

  • सामग्री है कि प्रत्येक भरता निर्दिष्ट ?में whereClauseक्रम में वे दिखाई देते हैं

दूसरे

  • जैसे whereClauseकि कीवर्ड के बाद का स्टेटमेंट या nullयदि आप इसका उपयोग नहीं करते हैं।

उदाहरण

String[] tableColumns = new String[] {
    "column1",
    "(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
    "value1",
    "value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
        null, null, orderBy);

// since we have a named column we can do
int idx = c.getColumnIndex("max");

निम्नलिखित कच्ची क्वेरी के बराबर है

String queryString =
    "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
    "WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);

जहां / बिंद -एआरजी संस्करण का उपयोग करके आप स्वचालित रूप से बच गए मूल्यों को प्राप्त करते हैं और यदि इनपुट-डेटा शामिल है तो आपको चिंता करने की ज़रूरत नहीं है '

असुरक्षित: String whereClause = "column1='" + value + "'";
सुरक्षित:String whereClause = "column1=?";

क्योंकि यदि मान में 'आपका कथन शामिल है, तो या तो आप टूट जाते हैं और आप अपवादित हो जाते हैं या अनपेक्षित चीजें करते हैं, उदाहरण के लिए value = "XYZ'; DROP TABLE table1;--"आपकी तालिका को छोड़ भी सकते हैं क्योंकि कथन दो कथन और एक टिप्पणी बन जाएगा:

SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'

आर्ग्स संस्करण का उपयोग करने XYZ'; DROP TABLE table1;--से बच 'XYZ''; DROP TABLE table1;--'जाएगा और केवल एक मूल्य के रूप में माना जाएगा। यहां तक ​​कि अगर 'बुरा काम करने का इरादा नहीं है, तो यह अभी भी काफी सामान्य है कि लोगों के पास उनके नामों में है या इसका उपयोग ग्रंथों, फाइलनाम, पासवर्ड आदि में किया जाता है, इसलिए हमेशा आर्ग्स संस्करण का उपयोग करें। ( हालांकि निर्माण intऔर अन्य प्राइमरी को सीधे इसमें शामिल करना ठीक है whereClause)


इस ... समूह में सीमा / ऑफसेट कहां से गिरता है? आ रही हैं? द्वारा आदेश?
सिंह 89

3
@ Lion789 के कई संस्करण हैं, जिनमें एक limitपैरामीटर है, जैसे developer.android.com/reference/android/database/sqlite/… यह अंत में सभी सरल पाठ "some_column LIMIT 10"orderBy
संक्षेपण है

2 तालिकाओं में शामिल होने के लिए यहां कोई विकल्प है?
विजय कुंभो

2
@VijayKumbhoje आपको टैबलेन के table1 CROSS JOIN table2रूप में सक्षम होना चाहिए । लेकिन वहाँ एक बिंदु है जहाँ मैं कच्चे माल को देखूंगा: stackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhoje अंत में जो कुछ भी आपको सहज लगता है / जो साफ दिखता है। queryतरीकों केवल जैसे कुछ कीवर्ड जोड़ रहे हैं SELECTऔर FROMतर्कों को (स्रोत देखें) फिर एक ऐसा rawQueryजिसके परिणामस्वरूप क्वेरी स्ट्रिंग के साथ। यदि आपकी क्वेरी उपलब्ध तर्क में अच्छी तरह से फिट नहीं है query, तो बस क्वेरी स्ट्रिंग स्वयं लिखें।
zapl

21

यह भविष्य के दर्शकों के लिए एक त्वरित संदर्भ होने के लिए एक अधिक सामान्य उत्तर है।

उदाहरण

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

प्रलेखन से स्पष्टीकरण

  • table स्ट्रिंग: क्वेरी के खिलाफ संकलन करने के लिए तालिका का नाम।
  • columns स्ट्रिंग: किस कॉलम में लौटना है इसकी एक सूची। पासिंग नल सभी कॉलमों को लौटा देगा, जो कि पढ़ने के डेटा को स्टोरेज से रोकने के लिए हतोत्साहित करता है जो उपयोग में नहीं आने वाला है।
  • selection स्ट्रिंग: एक फिल्टर, जो पंक्तियों को लौटाने की घोषणा करता है, एक SQL WHERE क्लॉज (WHERE खुद को छोड़कर) के रूप में स्वरूपित होता है। पासिंग नल दिए गए तालिका के लिए सभी पंक्तियों को वापस कर देगा।
  • selectionArgs स्ट्रिंग: आप चयन में शामिल हो सकते हैं, जो चयन में मानों से बदल दिया जाएगा, ताकि वे चयन में दिखाई दें। मान स्ट्रिंग्स के रूप में बाध्य होंगे।
  • groupBy स्ट्रिंग: समूह पंक्तियों की घोषणा करने वाला एक फ़िल्टर, जो SQL ग्रुप BY क्लॉज़ के रूप में स्वरूपित होता है (समूह को छोड़कर)। अशक्त गुजरने के कारण पंक्तियों को समूहीकृत नहीं किया जाएगा।
  • having स्ट्रिंग: एक फ़िल्टर घोषित करता है कि कर्सर को शामिल करने के लिए कौन सी पंक्ति समूह हैं, यदि पंक्ति समूहिंग का उपयोग किया जा रहा है, तो SQL HAVING क्लॉज (स्वयं को छोड़कर) के रूप में स्वरूपित किया गया है। पासिंग नल के कारण सभी पंक्ति समूहों को शामिल किया जाएगा, और आवश्यक है जब पंक्ति समूहन का उपयोग नहीं किया जा रहा है।
  • orderBy स्ट्रिंग: पंक्तियों को कैसे ऑर्डर किया जाए, एक SQL ORDER BY क्लॉज (ORDER BY को छोड़कर) के रूप में स्वरूपित किया गया। पासिंग नल डिफ़ॉल्ट सॉर्ट क्रम का उपयोग करेगा, जो अनियंत्रित हो सकता है।
  • limit स्ट्रिंग: क्वेरी द्वारा लौटाए गए पंक्तियों की संख्या को सीमित करता है, जिसे LIMIT क्लॉज के रूप में स्वरूपित किया गया है। पासिंग नल कोई लिमिट क्लॉज को दर्शाता है।

16

जहाँ क्लॉज और आर्ग्स मिलकर SQL क्वेरी का WH कथन तैयार करते हैं। तो कहते हैं कि आप व्यक्त करना चाहते हैं

WHERE Column1 = 'value1' AND Column2 = 'value2'

फिर आपका कहां क्लॉज़ और कहाँ आर्गेज़ निम्नानुसार होंगे

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

यदि आप सभी तालिका स्तंभों का चयन करना चाहते हैं, तो मेरा मानना ​​है कि तालिका स्ट्रिंग में दिए गए एक अशक्त स्ट्रिंग पर्याप्त होगा।


जोड़ देना नहीं है ?में ', 'स्वचालित रूप से यदि आवश्यक जोड़ा जाता है
zapl

1

यदि आपकी SQL क्वेरी इस प्रकार है

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

फिर क्वेरी () विधि के लिए, हम निम्न कार्य कर सकते हैं: -

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowID, यहाँ =है whereखंड। सभी मानों का चयन करने के लिए आपको सभी कॉलम नाम देने होंगे:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

और यहाँ डेटाबेस के लिए एक अच्छा ट्यूटोरियल है।

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