मैं वर्तमान में Android संपर्क सामग्री प्रदाता के साथ काम कर रहा हूँ और वर्तमान में इस मुद्दे के बिना एक संपर्क पूर्ण प्रदर्शन नाम का उपयोग कर सकते निम्नलिखित कोड का उपयोग कर:एकल प्रदर्शन नाम के बजाय संपर्क का पहला और अंतिम नाम प्राप्त करें?
String[] PROJECTION = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER,
};
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")"
+ " LIKE '" + constraint + "%' " + "and " +
ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'";
Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI,
PROJECTION, SELECTION, null, sortOrder);
हालांकि मैं प्रथम और अंतिम नाम दोनों संपर्कों को प्राप्त करने में सक्षम होना चाहते अलग-अलग, मैंने इसे प्राप्त करने के प्रयास में संरचित नाम का उपयोग करने का प्रयास किया है, लेकिन मुझे यह काम नहीं लग रहा है।
क्या कोई मुझे सही दिशा में इंगित कर सकता है कि नाम को पहले और आखिरी में विभाजित करने के लिए स्ट्रक्चरर्ड नाम का सही तरीके से उपयोग कैसे किया जाए?
अद्यतन:
12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number
अगर मैं अनुमान निकालें:
String[] PROJECTION = new String[] {
ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME,
ContactsContract.Data.HAS_PHONE_NUMBER,
};
String SELECTION = ContactsContract.CommonDataKinds.StructuredName.IN_VISIBLE_GROUP + " = '1'";
String sortOrder = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, sortOrder);
int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME);
while (cursor.moveToNext()) {
String given = cursor.getString(indexGivenName);
String family = cursor.getString(indexFamilyName);
String display = cursor.getString(indexDisplayName);
Log.e("XXX", "Name: | " + given + " | " + family + " | " + display);
}
हालांकि अनुमान का उपयोग कर के रूप में निम्नानुसार एक दुर्घटना का कारण बनता है:
मैं निम्नलिखित का प्रयास किया है hovanessyan की सलाह के बाद मुझे सभी परिणामों को मुद्रित किया जाता है लेकिन उनमें से बहुत से न्यूल होते हैं।
उदाहरण के लिए:
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null
तो किसी को क्या मैं में है कि मेरे अनुमान से काम नहीं करता गलत कर रहा हूँ देख सकते हैं?
आगे अद्यतन:
मैं अपने अनुमान के साथ मुद्दों का हल है लेकिन अब मैं एक मुद्दा जहां आंकड़े सामग्री प्रदाता सभी रिक्त डाटा के साथ मेरे पास वापस आपूर्ति और मेरे कोड में शून्य सूचक अपवाद उत्पन्न कर रहा है है ।
संपर्कों से एक कर्सर गिनती। संपर्क मुझे उदाहरण के लिए 115 वापस देता है लेकिन डेटा तालिका का उपयोग करके मुझे उसी पैरामीटर का उपयोग करके 464 वापस देता है और इससे मेरे ऐप में बड़ी समस्याएं आ रही हैं।
किसी के पास कोई विचार है कि ऐसा क्यों है?
यह किया जा सकता है एक फ़िल्टरQuery के भीतर जो समस्या उत्पन्न कर रहा है, मुझे आईडी, डिस्प्लेनाम और हैसफोन नंबर कॉलम प्राप्त करने में सक्षम होना चाहिए, जहां मेरी स्ट्रिंग बाधा या तो दिए गए या पारिवारिक नाम के बराबर है। इसलिए मुझे एक प्रबंधितQuery की आवश्यकता है और ऐसा लगता है कि कुछ समस्याएं पेश हो रही हैं। –
इसे प्राप्त करने के लिए आपको सामान्य तालिका डेटा का उपयोग करना होगा: http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan
मैंने जेनेरिक डेटा तालिका का उपयोग करके जानकारी प्राप्त करने का प्रयास किया है और कुछ मुद्दों पर आ गए हैं, अगर आप आगे की मदद कर सकते हैं, तो मैंने अपना प्रश्न संपादित कर लिया है। –