2013-04-24 45 views
0

删除此联系人我可以更新这样一个电话号码:为什么我不能在androidÉ

ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
     .withSelection("_id =?", new String[] { id }) 
     .withValue(Phone.NUMBER, "5555555555").build()); 

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

但是,在我更新显示名称,但这并没有工作:

ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI) 
     .withSelection("_id=?", new String[] { id }) 
     .withValue("display_name", "jack").build()); 

这是任何字:

context.getContentResolver().update(
       ContactsContract.Data.CONTENT_URI, 
       values, 
       ContactsContract.CommonDataKinds.StructuredName._ID + "=" 
         + id 
         + " and mimetype='vnd.android.cursor.item/name'", 
       null); 
+0

你试过CommonDataKinds.StructuredName.DISPLAY_NAME而不是“display_name”, – 2013-04-24 02:04:43

+0

CommonDataKinds.StructuredName.DISPLAY_NAME和Phone.NUMBER都是“data1”,那么如何区分? – user1502241 2013-04-24 02:09:20

回答

2

display_name是只读的。

任何想要与联系提供商进行详细工作的人都应该肯定阅读联系人提供程序API指南并遵循联系人提供程序Android培训。联系人提供程序是一个包含许多规则的复杂数据库系统,除非您了解提供程序的基本布局,否则会遇到令人沮丧的问题。

CommonDataKinds.StructuredName.DISPLAY_NAME和CommonDataKinds.Phone.NUMBER都设置为data1,因为实际上它们不引用单独的表。相反,它们都引用ContactContracts.Data中的列DATA1。 全部联系人的详细数据存储在ContactContracts.Data中,而不管它是什么。例如,联系人的所有电话号码和所有电子邮件地址都存储在ContactContracts.Data中。您通过行的MIMETYPE值告诉另一种类型的行的方式。文档详细解释了这一点。

另一个提示:您应该避免在自己的代码中添加,删除或更新联系人提供程序。相反,发送一个意图,启动设备的联系人应用程序或允许用户选择要使用的联系人应用程序。这允许用户在联系人应用中而不是您的应用中完成工作。这也在文档中描述。