2012-07-27 27 views
6

मैं एक ऐसा ऐप्लिकेशन बना रहा हूं जो प्रेषक संख्या के आधार पर इनबॉक्स में संदेश खोजें। यहां मेरा कोड है:क्वेरी फ़ंक्शन में LIKE क्लॉज का उपयोग कैसे करें

public void onClick(View v) 
{ 
    Toast.makeText(this, "search", Toast.LENGTH_LONG).show(); 
    final Uri SMS_INBOX = Uri.parse("content://sms/inbox"); 

    String[] colList = {"address", "body"}; 

    Cursor c = getContentResolver().query(SMS_INBOX, colList, null, null,"DATE desc"); 

    String yz= String.valueOf(c.getCount()); 
    Toast.makeText(this, yz, Toast.LENGTH_LONG).show(); 

    if(c.moveToFirst()) 
    { 
     Toast.makeText(this, searchtxt.getText(), Toast.LENGTH_LONG).show(); 

     for(int i=0;i<c.getCount();i++) 
     { 
      String number=c.getString(c.getColumnIndexOrThrow("address")).toString(); 
      boolean match = number.toUpperCase().indexOf(searchtxt.getText().toString()) != -1; 

      if (match) 
      { 
       Toast.makeText(this, String.valueOf(i), Toast.LENGTH_LONG).show(); 
       String body= c.getString(c.getColumnIndexOrThrow("body")).toString(); 
       tv.setText(tv.getText() + "\n" + body); 
      } 
      c.moveToNext(); 
     } 
    } 
    else 
    { 
     Toast.makeText(this, "Inside else", Toast.LENGTH_LONG).show(); 
    } 

    c.close(); 
} 

उपरोक्त कोड ठीक काम करता है लेकिन यह इनबॉक्स में सभी संदेशों को पुनर्प्राप्त करता है। मैं चाहता हूं कि इसे केवल उन संदेशों को पुनर्प्राप्त करना चाहिए जो प्रेषक संख्या से मेल खाते हैं। इसके लिए मैंने LIKE क्लॉज का उपयोग करके एक क्वेरी की कोशिश की, लेकिन इसके साथ यह 0 रिकॉर्ड देता है। LIKE खंड का उपयोग करने का सही तरीका क्या है। "%" और "_": यहाँ कोड है जो मुझे पसंद का उपयोग कर

String[] colList = {"address", "body"}; 
String[] argList = {"'%"+searchtxt.getText().toString()+"%'"}; 
Cursor c = getContentResolver().query(SMS_INBOX, colList, "address LIKE ?", argList,"DATE desc"); 

String yz= String.valueOf(c.getCount()); 
Toast.makeText(this, yz, Toast.LENGTH_LONG).show(); 

कृपया मेरी मदद करो बाहर .... धन्यवाद कोशिश की ...

+0

शायद आपको ILIKE का उपयोग करना चाहिए, जो क्वेरी केस असंवेदनशील – Alptugay

+0

थैंक्स अल्पटुगे .... बनाता है लेकिन यह काम करता है .. –

उत्तर

7

वहाँ दो जोकर है।

"%" कोई भी स्ट्रिंग (एकाधिक वर्ण),

"_" एक (और केवल एक) चरित्र को बदल रहा है की जगह है।

उदाहरण के लिए:

LIKE 'B%' 

तुम सब कुछ है जो 'बी' के साथ शुरू होता ढूँढ़ने दें। (जैसे "बैटमैन");

LIKE '%B%' 

आपको "बी" युक्त कुछ भी खोजने देता है। (जैसे "एबीबीए");

LIKE'_B%' 

आपको एक कैरेक्टर, फिर एक "बी" युक्त सब कुछ मिल जाए। (जैसे "एबरक्रॉम्बी)"।

यदि आप एक स्ट्रिंग जो "%" या "_" शामिल प्राप्त करना चाहते हैं, तो आप एक भागने caracter उपयोग कर सकते हैं:

LIKE '%#_B%' ESCAPE # 

आप किसी भी तार जिसमें एक "_" के बाद ढूँढते हैं एक " बी '। (जैसे "TEST_BATMAN")।

मुझे आशा है कि इससे मदद मिलेगी।

Al_th

+0

Thanx Al_th ... लेकिन मैं जानना चाहता था कि क्वेरी फ़ंक्शन में LIKE क्लॉज का उपयोग कैसे करें। –

+0

मुझे लगता है कि समस्या उस प्रश्न का पहला जवाब है जब समस्या क्वेरी फ़ंक्शन के भीतर है: http://stackoverflow.com/questions/5179563/sqlite-like-problem-in-android। –

+0

Thanx बहुत .... आपके लिंक ने उद्देश्य की सेवा की .. :) –

2

निम्नलिखित संपादित प्रयास करें:

String[] argList = {"'%%%%"+searchtxt.getText().toString()+"%%%%'"};//TRY THIS 
         ^^^^         ^^^^ // TRY THIS 

Uri smsUri = Uri.parse("content://sms/inbox"); 
Cursor c = getContentResolver().query(smsUri, colList, "address LIKE ?", argList, "DATE"); 
+0

क्या आपने यह कोशिश की है ?? –

+0

मैंने किसी भी डेटाबेस को बनाया है। मैं एंड्रॉइड के डिफ़ॉल्ट इनबॉक्स से संदेश पुनर्प्राप्त कर रहा हूं। तो उस मामले में db.query का उपयोग नहीं किया जा सकता है। –

+0

Thanx आपके प्रयासों के लिए Chintan ... :) समस्या प्रश्न चिह्न के साथ था ... अद्यतन कोड निम्नानुसार है: स्ट्रिंग arg = "'%" + searchtxt.getText()। ToString() + " % ' "; कर्सर सी = getContentResolver() क्वेरी (एसएमएस_INBOX, collist, "पता LIKE" + arg, null, "DATE ​​desc"); –

0

मैं अपने कोड में इस समस्या थी, और यह मेरे कुछ समय लिया सही जवाब खोजने के लिए। मेरे लिए क्या काम किया गया है @ उरेशी गुप्ता ने अपने जवाब में लिखा था।

यहां मेरा कामकाजी कोड है, अनुकूलित किया गया है ताकि उपयोगकर्ता सटीक खोज क्वेरी कर सके या क्वेरी (और ऑपरेटर या OR ऑपरेटर) में शब्दों वाले मानों की खोज कर सके। मेरे कोड एक CursorLoader का उपयोग करता है, लेकिन यह इस उदाहरण के लिए एक ContentResolver का उपयोग कर के रूप में ही है:

 public static String getSelectionForGivenKeywordsAndOperator(String keyword_list, String operator) { 

      String returnSQLCommand = null; 
      if(keyword_list.length()==0) return returnSQLCommand; 

      switch (operator) { 
       case "EXACT": 
        returnSQLCommand = COLUMN_KEYWORD + "='" + keyword_list + "'"; 
        break; 
       default: //operator is "AND" or "OR" 
        List<String> keywords = new ArrayList<>(); 
        if (keyword_list.contains(" ")) keywords = Arrays.asList(keyword_list.split(" ")); 
        else if (keyword_list.contains(",")) keywords = Arrays.asList(keyword_list.split(",")); 
        else if (keyword_list.contains(";")) keywords = Arrays.asList(keyword_list.split(";")); 
        else if (keyword_list.contains(".")) keywords = Arrays.asList(keyword_list.split(".")); 
        else keywords.add(keyword_list); 

        returnSQLCommand = "'%" + keywords.get(0) + "%'"; 
        if (keywords.size()>=1) { 
         returnSQLCommand = COLUMN_KEYWORD + " LIKE '%" + keywords.get(0) + "%'"; 
         for (int i = 1; i < keywords.size(); i++) { 
          returnSQLCommand = returnSQLCommand + " " + operator + " " + COLUMN_KEYWORD + " LIKE '%" + keywords.get(i) + "%'"; 
         } 
        } 
        break; 
      } 
      return returnSQLCommand; 
     } 

मैं सत्यापित है कि इस कोड के रूप में काम करता है:

String selection = myDbContract.myDbEntry.getSelectionForGivenKeywordsAndOperator(requested_keyword, "OR"); //Can write "EXACT"/"AND"/"OR" 
return new CursorLoader(this, myQueryUri, MY_TABLE_ELEMENTS, selection, null, null); 

और यहाँ डीबी अनुबंध में चयन विधि है योजना बनाई, आप इसे आजमाने के लिए स्वागत है।

संबंधित मुद्दे