Obecnie pracuję z Android Kontakty dostawcy treści i obecnie można uzyskać dostępu do kontaktów pełną nazwę wyświetlaną bez problemu za pomocą następującego kodu:Otrzymasz imię i nazwisko kontaktu zamiast pojedynczej nazwy wyświetlanej?
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);
Jednakże chcę, aby być w stanie uzyskać zarówno kontakty imię i nazwisko oddzielnie, próbowałem użyć StructuredName w próbie uzyskania tego, ale nie mogę sprawić, żeby działało.
Czy ktoś może wskazać mi właściwy kierunek, w jaki sposób poprawnie używać nazwy StructuredName, aby uzyskać podział nazwy na Pierwszy i Ostatni?
UPDATE:
Po porady hovanessyan za próbowałem następujące:
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);
}
Jednak używając projekcji powoduje zawieszenie się następująco:
12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number
Jeśli usunąć projekcji Otrzymuję wszystkie wyniki wydrukowane, ale wiele z nich zawiera NULL.
Na przykład:
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
więc każdy może zobaczyć, co robię źle, że moja projekcja nie działa?
INNE AKTUALIZACJA:
mam załatwione problemy z moim WYSTAJĄCEJ ale teraz mam problem, gdy dostawca treści danych jest dostarczanie mnie z powrotem ze wszystkimi danymi nieważna i powoduje NULL wyjątków wskaźnik w moim kodu .
Liczba kursorów z ContactsContract.Contacts zwraca mi 115 na przykład, ale użycie tabeli DATA daje mi powrót 464 przy użyciu tych samych parametrów, co powoduje ogromne problemy w mojej aplikacji.
Ktoś ma jakieś pomysły, dlaczego tak jest?
To musi być zrobione w przypadku FilterQuery, który wydaje się być przyczyną problemu, potrzebuję móc uzyskać kolumny ID, DisplayName i HasPhoneNumber, w których moje ograniczenie String jest równe nazwie Given lub Family. Więc potrzebuję managedQuery i wydaje się, że przedstawia pewne problemy. –
Musisz użyć ogólnej tabeli Dane, aby to osiągnąć: http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan
Podjęto próbę uzyskania informacji przy użyciu ogólnej tabeli danych i natknąłem się na pewne problemy, zredagowałem moje pytanie na wypadek, gdybyś mógł pomóc dalej, dzięki. –