2010-07-30 4 views
9

Tôi đang cố gắng lấy số điện thoại của số liên lạc sau khi tôi đã lấy số ID của họ từ hoạt động được tích hợp sẵn. Tuy nhiên, bất cứ khi nào tôi truy vấn cơ sở dữ liệu bằng cách sử dụng con trỏ trong mã của tôi dưới đây - tôi nhận được hàng không trả về mặc dù có một số điện thoại di động cho số liên lạc tôi đã chọn.Truy xuất số điện thoại liên lạc từ URI trong Android

Bất kỳ ai cũng có thể chỉ cho tôi một hướng tốt hơn hoặc hiển thị ví dụ về cách nhận số điện thoại của số liên lạc SAU KHI nhận ID người dùng của họ?

Mã của tôi:

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); 
    } 
    }; 
} 

Trả về sản lượng Log

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

Từ đó tôi vượt qua ID (6802) vào một phương pháp được thiết kế để trả lại số điện thoại từ ID với loại đã cho (trong trường hợp này là ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)

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; 
} 

Lợi nhuận nào null cho một số điện thoại - có nghĩa là nó không thể tìm thấy hàng mà tôi đang cố gắng truy cập - có nghĩa là có gì đó không đúng với truy vấn của tôi - tuy nhiên nếu tôi kiểm tra một số liên lạc có số điện thoại di động nhận được truy vấn 0 hàng?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn bạn rất nhiều!

Trả lời

12

Tôi đã tìm thấy câu trả lời.

Lý do tôi đã không nhận được bất kỳ hàng từ con trỏ được bởi vì tôi đã sử dụng dòng

ContactsContract.CommonDataKinds.Phone.CONTACT_ID 

"Id của các hàng trong bảng hệ rằng dữ liệu này thuộc về."

Vì tôi đã nhận được URI từ bảng địa chỉ liên hệ dù sao - điều này là không cần thiết và những điều sau đây nên được thay thế. ID là số tương ứng với số liên lạc trong bảng điện thoại không phải là số liên lạc thô.

ContactsContract.CommonDataKinds.Phone._ID 

Trao đổi các dòng trả lại kết quả chính xác trong truy vấn. Mọi thứ dường như đang hoạt động tốt vào lúc này.

+0

Điều này đang hoạt động ngay cả khi lời giải thích của bạn không rõ ràng. Tại sao điện thoại.CONTACT_ID (contact_id) không khớp với CONTACTS._ID (_id) – redochka

+0

Có thể dễ dàng hơn nếu tôi giải thích theo cách này: '_ID' là dành cho cơ sở dữ liệu,' CONTACT_ID' là dành cho ID liên hệ khi bạn không truy vấn bảng cụ thể đó . Không giúp đỡ à? – hwrdprkns

+2

Tóm tắt: Phones._ID == Contacts._ID – redochka

2

Điều này sẽ hiệu quả, (có thể thử mất kiểu)

Số điện thoại được lưu trữ trong bảng riêng và cần được truy vấn riêng. Để truy vấn bảng số điện thoại, hãy sử dụng URI được lưu trữ trong biến SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI. Sử dụng WHERE có điều kiện để nhận số điện thoại cho số liên lạc được chỉ định.

 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(); 
    } 

Thực hiện truy vấn thứ hai đối với danh bạ Android Cơ sở dữ liệu SQLite. Các số điện thoại được truy vấn đối với URI được lưu trữ trong ContactsContract.CommonDataKinds.Phone.CONTENT_URI. ID liên lạc được lưu trong bảng điện thoại dưới dạng ContactsContract.CommonDataKinds.Phone.CONTACT_ID và mệnh đề WHERE được sử dụng để giới hạn dữ liệu được trả về.

+1

Bạn đã sao chép câu trả lời của mình trên một câu hỏi khác cùng loại (http://bit.ly/ayUbeg). Tôi nhìn vào câu hỏi đó nhưng tôi không nên làm điều này vì ý định ban đầu của tôi. – hwrdprkns