2012-11-06 4 views
1

클래스를 만들려고하는데 그 필드는 연락처 정보 (이름, 주소 등)입니다. 나는 여러 연락처를 만든 에뮬레이터에서 연락처 커서의 데이터 열 4가 잘못되었습니다.

public class ContactObject { 

private Activity actividad; 
private Uri contactUri;`enter code here` 
// variable para asegurarse que la consulta de contacto se realizó correctamente 
private boolean isOK = true; 

private String displayName; 
private String givenName; 
private String familyName; 
private String region; 
private String postcode; 
private String city; 
private String street; 


public ContactObject(Activity actividad, Uri contactUri) { 
    super(); 
    this.actividad = actividad; 
    this.contactUri = contactUri; 

    Cursor c = null; 
    try{ 
     String[] selection = new String[]{ 
       ContactsContract.CommonDataKinds.StructuredPostal.STREET, 
      ContactsContract.CommonDataKinds.StructuredPostal.CITY, 
       ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, 
      ContactsContract.CommonDataKinds.StructuredPostal.REGION, 
      ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, 
      ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, 
      ContactsContract.Contacts.DISPLAY_NAME      
     }; 

     c = actividad.getContentResolver().query(contactUri, selection,null, null, null); 
     if (c != null && c.moveToFirst()) { 
      this.street = c.getString(0); 
      this.city = c.getString(1); 
      this.postcode = c.getString(2); 
      this.region = c.getString(3); 
      this.givenName = c.getString(4); 
      this.familyName = c.getString(5); 
      this.displayName = c.getString(6); 
     } 
    }catch(Exception e){ 
     CLog.e("peta constructor ContactObject: " + e.getMessage()); 
     isOK = false; 
    } 
} 
// getters and setters 
} 



// code to launch contact picker 
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, 
       Contacts.CONTENT_URI); 
startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT); 


// code to create the ContactObject 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 
     case CONTACT_PICKER_RESULT: 
      Uri uri = data.getData(); 

      if (uri != null) { 
       ContactObject co = new ContactObject(actividad, uri); 
       String mensaje; 
       if (co.isOK()){ 
        mensaje = "Contacto encontrado: " + co.getDisplayName(); 
       }else{ 
        mensaje = "error recuperando datos del contacto " + uri.toString(); 
       } 
       CToast.mensajeLargo(mensaje, actividad.getApplicationContext()); 
      } 
     } 
    } 
} 

(만 & 전화 이름). 테스트 응용 프로그램에서 contactPicker onResult를 호출하고 연락처 uri로 ContactObject를 만듭니다. 그것을 실행할 때, 예외 메시지를 던집니다. 메시지 "invalid column data4"입니다.

"data4"는 ContactsContract.CommonDataKinds.StructuredPostal.STREET 상수의 값입니다. 그러나 DISPLAY_NAME에 대해서만 쿼리하면 문제없이 처리됩니다.

나는이 연락처에는 주소가 없다는 것을 알고 있지만 많은 (실제) 전화 연락처에는 주소가 없으므로 응용 프로그램이 단지 충돌로 인해 충돌하지 않는다는 것을 알고 있습니다.

내가 뭘 잘못하고 있니?

+1

2.0 이하의 에뮬레이터를 사용하고 있습니까? api 4 이하는 이러한 구조화 된 주소 필드를 포함하지 않았습니다. – Guykun

+0

대상이 2.2, 에뮬레이터가 3입니다. 대신 ContactsContract.CommonDataKinds를 사용해야합니까? 아니면 더 최신 클래스 (2.2/API8 내)가 있습니까? – Frank

답변

0

나는 접촉 선택기를 시작하는 의도를 변경하여 작업하는 데있어 두 파일을 관리자, 연락처 또는 (이후 설치됨) 보관함. 연락처를 선택하면 제대로 작동합니다. 선택한 연락처에서 모든 정보를 얻습니다. 그러나 연락처 피커를 호출하고 사용자의 선택에 맡기지 않는 방법이 없는지 궁금합니다.

1

사용중인 콘텐츠 URI는 무엇입니까? StructuredPostal StructuredName 연락처

귀하의 오류가 당신이 열 이름이없는 테이블의 열 이름을 얻으려고 노력하고 있다고 말한다 :

영사는 세 가지 다른 장소에서 열 이름을 포함합니다.

특히 ContactsContract.CommonDataKinds.StructuredPostal.STREET = "data4"를 볼 수 있습니다. 쿼리가 ContactsContract.DATA 테이블과 관련이 없으면 오류가 발생합니다.

연락처 공급자 문서를 다시 참조하십시오. 그것은 나를 요구 사용하는 작업을 선택하려면이 하나를 사용하여 내 (실제) 휴대 전화에서 테스트

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.setType(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); 
     startActivityForResult(intent, CONTACT_PICKER_RESULT); 

:

+0

URI는 ContactPickerIntent에서 가져온 Content.URI입니다. 나는 그들이 모두 동일한 데이터 세트를 질의했다고 믿는 서로 다른 코드 스 니펫을 섞은 것 같다. 실제로 문서를 두 번 확인해야합니다. – Frank