2011-12-08 36 views
8

Tôi hiện đang làm việc với Android Liên hệ nhà cung cấp nội dung và hiện có thể truy cập vào một địa chỉ liên lạc tên hiển thị đầy đủ mà không vấn đề bằng cách sử dụng đoạn mã sau:Nhận tên và họ của một liên hệ thay vì tên hiển thị duy nhất?

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

Tuy nhiên tôi muốn để có thể có được cả hai địa chỉ liên lạc đầu tiên và tên cuối cùng một cách riêng biệt, tôi đã cố gắng sử dụng StructuredName trong một nỗ lực để có được điều này nhưng tôi dường như không thể làm cho nó hoạt động.

Bất kỳ ai có thể chỉ cho tôi đúng hướng về cách sử dụng StructuredName đúng cách để có được tên được chia thành Đầu tiên và Cuối cùng không?

UPDATE:

Sau lời khuyên hovanessyan của tôi đã cố gắng như sau:

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

Tuy nhiên bằng cách sử dụng DỰ gây ra một vụ tai nạn như sau:

12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number 

Nếu tôi loại bỏ các DỰ Tôi nhận được tất cả các kết quả in ra nhưng rất nhiều trong số họ có chứa NULL.

Ví dụ:

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 

Vì vậy, ai cũng có thể thấy những gì tôi đang làm sai ở chỗ DỰ tôi không hoạt động?

THÊM UPDATE:

Tôi đã sắp xếp ra các vấn đề với DỰ tôi nhưng bây giờ tôi có một vấn đề mà các nhà cung cấp nội dung dữ liệu được cung cấp cho tôi trở lại với tất cả các dữ liệu vô giá trị và gây ra ngoại lệ con trỏ NULL trong mã của tôi .

Số đếm con trỏ từ ContactsContract.Contacts cung cấp cho tôi 115 ví dụ nhưng sử dụng bảng DATA cho tôi 464 bằng các tham số giống nhau và điều này đang gây ra các sự cố lớn trong ứng dụng của tôi.

Bất kỳ ai cũng có bất kỳ ý tưởng nào về lý do đó?

Trả lời

13

Hãy xem ContactsContract.CommonDataKinds.StructuredName lớp học. Bạn có tất cả các cột cần thiết ở đó, và có lẽ bạn có thể làm điều gì đó như:

Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, other_query_params_for_filtering); 

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

Nó phải được thực hiện bên trong một FilterQuery mặc dù có vẻ như đang gây ra vấn đề, tôi cần có khả năng nhận các cột ID, DisplayName và HasPhoneNumber nơi ràng buộc String của tôi bằng với tên Given hoặc Family. Vì vậy, tôi cần một managedQuery và điều này dường như được trình bày một số vấn đề. –

+0

Bạn phải sử dụng Bảng dữ liệu chung để đạt được điều này: http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan

+0

Tôi đã cố gắng lấy thông tin bằng cách sử dụng bảng DATA chung và đã gặp một số vấn đề, tôi đã chỉnh sửa câu hỏi của tôi trong trường hợp bạn có thể trợ giúp thêm, cảm ơn. –

2

Đây là một chức năng chung để nhận dữ liệu người dùng từ ContactsContract.Data bảng:

Map<String, String> result = new HashMap<>(); 
Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + "='" + YOUR_CONTACT_ID + "'", null, null); 
if (cursor != null) { 
    while (cursor.moveToNext()) { 
     String mime = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)); 
     switch (mime) { 
      case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE: 
       result.put(FIRST_NAME, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME))); 
       result.put(LAST_NAME, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))); 
       break; 
      case ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE: 
       result.put(CITY, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); 
       result.put(STREET, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); 
       result.put(ZIP, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); 
       break; 
      case ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE: 
       if (ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE == cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))) { 
        result.put(MOBILE, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
       } 
       break; 
     } 
    } 
    cursor.close(); 
} 
return result; 
2
 Cursor phone_cursor = cr.query(ContactsContract.CommonDataKinds. 
       Phone.CONTENT_URI, null, null, null, null); 
     while (phone_cursor.moveToNext()) { 
      try { 
      int id = Integer.parseInt(phone_cursor.getString(phone_cursor.getColumnIndex 
        (ContactsContract.CommonDataKinds.Phone.CONTACT_ID))); 
      Cursor name_cursor = cr.query(ContactsContract.Data.CONTENT_URI,null, 
        ContactsContract.Data.CONTACT_ID + " = " + id, null, null); 

       String name = phone_cursor.getString(phone_cursor.getColumnIndex 
         (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
       String first_name =""; 
       String last_name = ""; 
       while (name_cursor.moveToNext()) { 
        if(name_cursor.getString(name_cursor.getColumnIndex 
          (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))!=null){ 
        first_name = name_cursor.getString(name_cursor.getColumnIndex 
          (ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
        last_name = name_cursor.getString(name_cursor.getColumnIndex 
          (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
       }} 
       name_cursor.close(); 
       String phoneNumber = phone_cursor.getString(phone_cursor.getColumnIndex 
         (ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      } catch (Exception e) { 
      } 
     } 
     phone_cursor.close(); 
Các vấn đề liên quan