2010-01-28 13 views
31

मैं उपयोगकर्ता संपर्क प्राप्त करना चाहता हूं और फिर किसी प्रकार की नियमित अभिव्यक्ति जोड़ना चाहता हूं और उन्हें सूची दृश्य में जोड़ना चाहता हूं। मैं वर्तमान के माध्यम सेएंड्रॉइड में सामग्री रिज़ॉल्वर के परिणामों को कैसे फ़िल्टर करें?

getContentResolver().query(People.CONTENT_URI, null, null, null, null);

सभी संपर्कों को मिलता है और फिर उन्हें कि SimpleCursorAdapter फैली एक कस्टम वर्ग के लिए पारित करने के लिए कर रहा हूँ।

तो मैं कैसे केवल उन संपर्कों को एक रेगुलर एक्सप्रेशन से मेल और उन सभी संपर्कों को नहीं प्राप्त करने के लिए पता करना चाहते हैं।

उत्तर

63

getContentResolver().query(People.CONTENT_URI, null, null, null, null); 

के बजाय आप इस एक पैरामिट्रीकृत अनुरोध (? का प्रयोग करके) का उपयोग करता है की तरह

final ContentResolver resolver = getContentResolver(); 
final String[] projection = { People._ID, People.NAME, People.NUMBER }; 
final String sa1 = "%A%"; // contains an "A" 
cursor = resolver.query(People.CONTENT_URI, projection, People.NAME + " LIKE ?", 
    new String[] { sa1 }, null); 

कुछ का उपयोग करें और एक अलग तर्क के रूप में वास्तविक मान प्रदान करता है चाहिए, इस संयोजन से बचा जाता है और एसक्यूएल इंजेक्शन मुख्य रूप से यदि आप उपयोगकर्ता से फिल्टर अनुरोध कर रहे हैं रोकता है। उदाहरण के लिए आप उपयोग कर रहे हैं

cursor = resolver.query(People.CONTENT_URI, projection, 
    People.NAME + " = '" + name + "'", 
    new String[] { sa1 }, null); 

कल्पना

name = "Donald Duck' OR name = 'Mickey Mouse") // notice the " and ' 

है और आप तार श्रृंखलाबद्ध कर रहे हैं।

+0

आपके सभी प्रतिक्रियाओं के लिए धन्यवाद, मैं वास्तव में इसकी सराहना करता हूं। – maxsap

+2

बहुत अच्छा विवरण, बहुत बहुत शुक्रिया! –

5

आप एसक्यूएल प्रकार इनपुट के साथ सामग्री प्रदाता क्वेरी कर सकता है, क्वेरी विधि सिर्फ एक एसक्यूएल आदेश के लिए एक आवरण है।

एक उदाहरण है जहाँ मैं दिए गए एक विशेष संख्या

String [] requestedColumns = { 
      Contacts.Phones.NAME, 
      Contacts.Phones.TYPE 
    }; 

Cursor contacts = context.getContentResolver().query(
      Contacts.Phones.CONTENT_URI, 
      requestedColumns, 
      Contacts.Phones.NUMBER + "='" + phoneNumber + "'", 
      null, null); 

नोट अशक्त करने के बजाय मैं पैरामीटर एसक्यूएल बयान का निर्माण किया है कि एक संपर्क नाम के लिए क्वेरी है।

requestColumns डेटा कर रहे हैं मैं वापस पाने के लिए चाहते हैं और Contacts.Phones.NUMBER + '=' '+ PhoneNumber + "'" कहाँ खंड है, इसलिए मैं नाम और प्रकार जहां फोन नंबर से मेल खाता है

पुनः प्राप्त
3

आप एक कानूनी SQLite डाल करने के लिए सक्षम होना चाहिए जहां क्वेरी() विधि, एक की तरह शामिल तीसरा तर्क के रूप में खंड, लेकिन वहाँ SQLite में कोई मूल regexp समारोह है और एंड्रॉयड आप अपने खुद के परिभाषित जाने के लिए प्रतीत नहीं होता। तो इस पर निर्भर करता है कि आपकी ज़रूरतें कितनी जटिल हैं, अन्य SQLite स्थितियों का एक सेट और पसंद अभिव्यक्ति चाल चल सकती है।

ContentResolver और SQLite expressions के तहत query method पर दस्तावेज़ देखें।

1

वास्तव में कॉललॉग सामग्री प्रदाता के साथ REGEXP काम करता है (इसका मतलब है कि regexp() फ़ंक्शन उस सामग्री प्रदाता के डेटाबेस https://sqlite.org/lang_expr.html#regexp के लिए परिभाषित किया गया है)! लेकिन यह बहुत धीमा है: ~ 1550 रिकॉर्ड ~ 1550 रिकॉर्ड।

String regexp = "([\\s\\S]{0,}" + 
TextUtils.join("||[\\s\\S]{0,}", numbers) + 
")"; 

cursor = context.getContentResolver().query(
CallLog.Calls.CONTENT_URI, 
null, 
CallLog.Calls.NUMBER + " REGEXP ?", 
new String[]{regexp}, 
CallLog.Calls.DATE + " DESC" 
); 
संबंधित मुद्दे