2010-07-30 2 views
9

내장 된 활동에서 ID 번호를 검색 한 후 연락처의 전화 번호를 가져 오려고합니다. 그러나 내가 아래 코드에서 커서를 사용하여 데이터베이스를 쿼리 할 때마다 - 내가 선택한 연락처의 모바일 번호가 있더라도 반환 된 행은 0이됩니다.연락처 전화 번호 검색 Android의 URI에서

누군가 더 나은 방향으로 나를 가리키거나 연락처의 전화 번호를 얻는 방법에 대한 예를 보여줄 수 있습니까?

내 코드 :

private Runnable getSMSRunnable() { 
    return new Runnable() { 
    public void run() { 
    Intent i = new Intent(Intent.ACTION_PICK, 
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
    startActivityForResult(i, CONTACTS_REQUEST_CODE); 
    } 
    }; 
} 

로그 출력 i가 함께 ID로부터 전화 번호를 반환하도록 설계된 방법에 ID (6802)를 통과한다에서

content://com.android.contacts/data/6802 

를 리턴 반환

public static String getContactPhoneNumberByPhoneType(Context context, long contactId, int type) { 
    String phoneNumber = null; 

    String[] whereArgs = new String[] { String.valueOf(contactId), String.valueOf(type) }; 

    Log.d(TAG, String.valueOf(contactId)); 

    Cursor cursor = context.getContentResolver().query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? and " 
        + ContactsContract.CommonDataKinds.Phone.TYPE + " = ?", whereArgs, null); 

    int phoneNumberIndex = cursor 
      .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER); 

    Log.d(TAG, String.valueOf(cursor.getCount())); 

    if (cursor != null) { 
     Log.v(TAG, "Cursor Not null"); 
     try { 
      if (cursor.moveToNext()) { 
       Log.v(TAG, "Moved to first"); 
       Log.v(TAG, "Cursor Moved to first and checking"); 
       phoneNumber = cursor.getString(phoneNumberIndex); 
      } 
     } finally { 
      Log.v(TAG, "In finally"); 
      cursor.close(); 
     } 
    } 

    Log.v(TAG, "Returning phone number"); 
    return phoneNumber; 
} 

(이 경우 ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE에) 타입 제공 전화 번호는 null입니다. 즉, 액세스하려는 행을 찾을 수 없다는 뜻입니다. 즉, 내 검색어에 문제가 있음을 의미합니다. 그러나 휴대 전화 번호가있는 연락처를 확인하면 어떻게됩니까? 0 행 쿼리를 얻으시겠습니까?

도움을 주시면 감사하겠습니다. 정말 고맙습니다!

답변

12

답변을 찾았습니다.

내가 커서에서 행을 받고되지 않은 이유는 내가

ContactsContract.CommonDataKinds.Phone.CONTACT_ID 

는 선 사용 하였다 때문 "연락처 테이블에있는 행의 ID가이 데이터가 속한를."

어쨌든 연락처 테이블에서 URI를 가져 오는 중 -이 것이 필요하지 않으며 다음을 대체해야합니다. ID는 원시 연락처가 아닌 전화 테이블의 연락처에 해당하는 ID입니다.

ContactsContract.CommonDataKinds.Phone._ID 

행을 바꾸면 검색어에 올바른 결과가 반환되었습니다. 지금은 모든 것이 잘 작동하는 것 같습니다.

+0

설명이 명확하지 않은 경우에도 작동합니다. 왜 전화.CONTACT_ID (contact_id)가 CONTACTS._ID (_id)와 일치하지 않습니다 – redochka

+0

이렇게 설명하면 더 쉽습니다. '_ID'는 데이터베이스 용이고 'CONTACT_ID'는 해당 테이블을 쿼리하지 않을 때 연락처 ID 용입니다. . 이게 도움이 되나요? – hwrdprkns

+2

결론 : Phones._ID == Contacts._ID – redochka

2

이 작동합니다은

전화 번호가 자신의 테이블에 저장됩니다 (어쩌면 유형을 잃고 시도) 개별적으로 조회 할 필요가있다. 전화 번호 테이블을 쿼리하려면 SDK 변수 ContactsContract.CommonDataKinds.Phone.CONTENT_URI에 저장된 URI를 사용하십시오. 지정된 연락처에 대한 전화 번호를 얻으려면 WHERE 조건을 사용하십시오.

 if (Integer.parseInt(cur.getString(
       cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
      Cursor pCur = cr.query(
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
     new String[]{id}, null); 
     while (pCur.moveToNext()) { 
     // Do something with phones 
     } 
     pCur.close(); 
    } 

Android 연락처 인 SQLite 데이터베이스에 대해 두 번째 쿼리를 수행하십시오. 전화 번호는 ContactsContract.CommonDataKinds.Phone.CONTENT_URI에 저장된 URI에 대해 쿼리됩니다. 연락처 ID는 ContactsContract.CommonDataKinds.Phone.CONTACT_ID로 전화 테이블에 저장되며 WHERE 절은 반환 된 데이터를 제한하는 데 사용됩니다.

+1

동일한 유형의 다른 질문 (http://bit.ly/ayUbeg)에 대한 답변을 복사했습니다. 저는 그 질문을 보았습니다. 그러나 나는 초기 의도 때문에 이것을 할 필요가 없었습니다. – hwrdprkns