2012-06-14 3 views
4

안녕하세요.이 필드와 함께 ContentResolver를 사용하여 연락처 데이터베이스에서 연락처 정보를 가져 오려고합니다. 하나의 쿼리로 연락처에 대한 이름, 번호, FORMATTED_ADDRESS, PHOTO 세부 정보를 얻으려고합니다.단일 쿼리에서 연락처에 대한 세부 정보 얻기

그래서 기본적으로 연락처 당 3 개의 쿼리를 만들어이 세부 정보를 가져와야합니다.

내가 알고 싶은 것은, 더 간단하고 효율적인 방법이 무엇입니까? 이 것을 달성하는 것입니다.

하지만 아래 코드를 사용하면 예외가 발생합니다.

java.lang.IllegalArgumentException: Invalid column data1 

어떤 솔루션이든 동일한 솔루션을 찾을 수 있습니까?

Uri uri    = ContactsContract.Contacts.CONTENT_URI; 
String[] projection = new String[] { ContactsContract.Contacts._ID, 
             ContactsContract.Contacts.DISPLAY_NAME, 
             ContactsContract.CommonDataKinds.Phone.NUMBER, 
             ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, 
             ContactsContract.CommonDataKinds.Photo.PHOTO}; 
String selection  = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'"; 
String[] selectionArgs = null; 
String sortOrder  = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

Cursor contacts   = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); 

답변

4

문제가 selection 일 수 있습니다. 너의 방식을 내 방식으로 바꿔라.

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
String[] projection = new String[] { ContactsContract.Contacts._ID, 
             ContactsContract.Contacts.DISPLAY_NAME, 
             ContactsContract.CommonDataKinds.Phone.NUMBER, 
             ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, 
             ContactsContract.CommonDataKinds.Photo.PHOTO}; 
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?"; 
String[] selectionArgs = { String.valueOf(1) }; 
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

Cursor contacts = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); 

항상 parametrized statements을 사용해야합니다. 당신의 접근은 위험합니다. 그리고 URI가 나빴습니다. 여기

+0

감사를 교체

이동하지만 난 코드'java.lang.IllegalArgumentException가 구현 한 후 같은 예외를 받고 오전 : 잘못된 열을 data1' –

+0

지금 시도해보십시오, 당신은 나쁜 uri가 있습니다. 나는 그것을 즉시 알아 채지 못했다. – Sajmon

+0

선택 항목을 삭제하고 selectionArgs를 쿼리에서 제외하고 나면 작동하지만이 대신에 FORMATTED_ADDRESS를 지정하면 PHONE_NUMBER가 그 이유를 알 수 없습니다. 하지만 디버깅에 나는 그것을 반환하는 열을 발견 "_id, display_name, data1, data1, data15"그것의 원래 이름을주지 않을거야. 또 하나의 문제는 적은 수의 커서를 제공한다는 것입니다. 기록이 남아 있고 연락처 책에 더 많은 기록이 있습니다 –

1

당신은 답장을 보내

ContactsContract.Contacts.CONTENT_URI; 

ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
+0

답장을 보내 주신 Vipul에게 감사드립니다. 제공된 URI를 사용하고 쿼리에서 selection 및 selectionArgs를 제거한 후 작동하지만 나에게 맞는 FORMATTED_ADDRESS를주지 않습니다. 이 그것의 PHONE_NUMBER 이유를 모르겠다.하지만 디버깅 나는 그것이 반환하는 열을 발견 "_id, display_name, data1, data1, data15"그것의 원래 이름을주지 않을 것이다.레코드 수 및 연락처 책에 더 많은 레코드가 있습니다 –

+0

Cursor contacts = getContentResolver(). query (uri, null, null, null, null); –

+0

URI는 무엇입니까? ContactsContract.CommonDataKinds.Phone.CONTENT_URI; –

관련 문제