2012-03-27 172 views
0

我目前正在開發一個應用程序,我需要將聯繫人插入到移動電話聯繫人列表中。使用ContactsContract.RawContacts批量插入,我成功地將聯繫人插入到電話簿中。在聯繫人插入獲取聯繫人ID

http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

但是試圖更新他們時,他們只需添加更多PHONENUMBER,而不是換舊人。

所以我來到ContactsContract.Data,通過Contact_ID可以明顯更新替換舊的電話號碼。

http://developer.android.com/reference/android/provider/ContactsContract.Data.html

我現在的問題是,是否有可能檢索Contacts_ID上插入?因此,當我通過此代碼插入聯繫人時:

ArrayList<ContentProviderOperation> ops = 
      new ArrayList<ContentProviderOperation>(); 
... 
int rawContactInsertIndex = ops.size(); 
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 
      .withValue(RawContacts.ACCOUNT_TYPE, accountType) 
      .withValue(RawContacts.ACCOUNT_NAME, accountName) 
      .build()); 

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
      .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) 
      .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 
      .withValue(StructuredName.DISPLAY_NAME, "Mike Sullivan") 
      .build()); 

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

我會找回Contacts_ID?

謝謝你提前給我任何幫助。

回答

0

更好的辦法,你得到_ID不是RAW_ID!

添加一個靜態變量:

static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { 
    ContactsContract.Contacts._ID, 
    ContactsContract.Contacts.DISPLAY_NAME, 
    ContactsContract.Contacts.STARRED, 
    ContactsContract.Contacts.TIMES_CONTACTED, 
    ContactsContract.Contacts.CONTACT_PRESENCE, 
    ContactsContract.Contacts.PHOTO_ID, 
    ContactsContract.Contacts.LOOKUP_KEY, 
    ContactsContract.Contacts.HAS_PHONE_NUMBER, 
}; 

然後添加插件後:

// Displayed name 
String displayed_name = "Contact's name goes here"; 

// Add the new contact 
try 
{ 
    context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

String select = "(" + ContactsContract.Contacts.DISPLAY_NAME + " == \"" +displayed_name+ "\")"; 
Cursor c = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select, null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
context.startManagingCursor(c); 

if (c.moveToNext()) 
{ 
    int id = new Integer(c.getString(0)).intValue(); 
} 

這對我的作品。

+0

謝謝,它適用於我。你剛剛解決了我的一個大問題 – Max 2012-03-28 12:38:05

+0

沒問題。也許你可以給我一隻手:http://stackoverflow.com/questions/9907751/android-update-a-contact – Manitoba 2012-03-28 12:44:57

0

當然可以!這裏是:

ContentProviderResult[] res; 
try 
{ 
    res = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
    if (res != null && res[0] != null) 
    { 
     String uri = res[0].uri.getPath().substring(14); 
     int contact_id = new Integer(uri).intValue()); 
    } 
} 
catch (RemoteException e) 
{ 
    e.printStackTrace(); 
} 
catch (OperationApplicationException e) 
{ 
    e.printStackTrace(); 
} 
+1

謝謝。那麼我認爲這不是Contact_ID,而是RawContact_ID,但是這應該解決我的問題。我會及時向大家發佈。再次感謝。 – Max 2012-03-27 14:57:07

+0

所以試了一下,發現由於某種原因字符串uri不是內容://com.android.contacts/raw_contacts/612但是/ raw_contacts/612。這意味着子串必須是14而不是44,所以子串(14)。再次感謝你的幫助。 – Max 2012-03-27 15:37:32

+0

我確實有跟進問題,當我刪除然後聯繫人條目它離開我與聯繫人稱爲「未知」。你知道我怎樣才能擺脫那種聯繫?是否需要通過RawContact_ID而不是Contact_ID進行刪除操作?如果是的話,你是否有代碼可以獲取Contact_ID而不是RawContact_ID? (Data.CONTENT_URI).withSelection(Data.RAW_CONTACT_ID +「=?」,new String [] {RawContact_ID}).build()); getContentResolver()。applyBatch(ContactsContract.AUTHORITY,ops); – Max 2012-03-27 16:02:32

相關問題