2011-12-08 3 views
8
私は現在、次のコードを使用して問題なく連絡先の完全な表示名にアクセスすることができ、現在のAndroidコンタクトコンテンツプロバイダと協力しています

単一の表示名ではなく、連絡先の名字を取得しますか?

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

は、しかし、私は最初と最後の名前の連絡先の両方を取得できるようにしたいが別に、これを取得しようとしてStructuredNameを使用しようとしましたが、動作させることができません。

誰でも正しい方向に、FirstNameとLastに名前を分割するためにStructuredNameを正しく使用する方法を教えてもらえますか?

UPDATE:私は次のことを試みたhovanessyanのアドバイスに従い

次のように

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

しかしPROJECTIONを使用するとクラッシュが発生します。

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

私はPROJECTIONを削除した場合すべての結果が表示されますが、多くは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 
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 

だから、誰もが、私は私のPROJECTIONが動作しないということで間違ってやっているかを見ることができますか?

FURTHER UPDATE:

私は私のPROJECTIONと課題を整理しているが、今、私は、データコンテンツプロバイダは、すべてのヌルのデータを私に戻って供給し、私のコードでNULLポインタ例外を引き起こしている問題を持っています。

ContactsContract.Contactsからのカーソルカウントは私に戻って115を返しますが、DATAテーブルを使用すると同じパラメータを使用して464が返され、これがアプリで大きな問題を引き起こしています。

誰もがそれが何であるか考えていますか?

答えて

13

ContactsContract.CommonDataKinds.StructuredNameクラスをご覧ください。あなたはそこにすべての必要な列を持っている、とあなたはおそらくのような何かを行うことができます:ここで

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

それは行う必要がありますFilterQuery内で問題を引き起こしているようだが、私はString、DisplayString、HasPhoneNumberのカラムを取得できる必要があります。ここでは、String制約はGivenまたはFamilyのいずれかの名前になります。ですから、私はmanagedQueryが必要です。これはいくつかの問題を提示しているようです。 –

+0

これを実現するには、汎用テーブルDataを使用する必要があります。http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan

+0

一般的なDATAテーブルを使用して情報を取得しようとしました。いくつかの問題に出くわしました、私はあなたのおかげでさらに助けることができる場合のために私の質問を編集しました。 –

2

ContactsContract.Dataテーブルからユーザデータを取得するための一般的な機能である:

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(); 
関連する問題