如何在Android中以编程方式向联系人添加电话号码



我有一个可以添加和删除联系人的应用程序。如果在一个现有的联系人中有一个现有的值,它可以被很好地修改。但是我似乎无法在现有的联系人中插入新的值。例如,如果有家庭电话号码的现有值,但没有工作电话号码的值,我尝试使用以下代码添加值(联系人idValueworkNumber被传入):

    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValue(ContactsContract.Data.CONTACT_ID, idValue)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, workNumber)
            .build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

但是我得到一个NullPointerException:

java.lang.NullPointerException
    at com.android.providers.contacts.ContactsProvider2.insertData(ContactsProvider2.java:2604)
    at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:2452)
    at com.android.providers.contacts.SQLiteContentProvider.insert(SQLiteContentProvider.java:106)
    at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2256)
    at android.content.ContentProviderOperation.apply(ContentProviderOperation.java:214)
    at com.android.providers.contacts.SQLiteContentProvider.applyBatch(SQLiteContentProvider.java:216)
    at com.android.providers.contacts.ContactsProvider2.applyBatch(ContactsProvider2.java:2290)
    at android.content.ContentProvider$Transport.applyBatch(ContentProvider.java:217)
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:194)
    at android.os.Binder.execTransact(Binder.java:336)
    at dalvik.system.NativeStart.run(Native Method)
谁能告诉我我做错了什么?

您缺少withValue(Phone.TYPE, Phone.TYPE_WORK)

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
        .withValue(ContactsContract.Data.RAW_CONTACT_ID, idValue)
        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, workNumber).
withValue(Phone.TYPE, Phone.TYPE_WORK)
        .build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

编辑

你是正确的,我检查了data表的模式,如下所示,它只使用原始联系人id,而不使用联系人id

CREATE TABLE data (_id INTEGER PRIMARY KEY AUTOINCREMENT,
package_id INTEGER REFERENCES package(_id),
mimetype_id INTEGER REFERENCES mimetype(_id) NOT NULL,
raw_contact_id INTEGER REFERENCES raw_contacts(_id) NOT NULL,
is_primary INTEGER NOT NULL DEFAULT 0,
is_super_primary INTEGER NOT NULL DEFAULT 0,
data_version INTEGER NOT NULL DEFAULT 0,
data1 TEXT,
data2 TEXT,
data3 TEXT,
data4 TEXT,
data5 TEXT,
data6 TEXT,
data7 TEXT,
data8 TEXT,
data9 TEXT,
data10 TEXT,
data11 TEXT,
data12 TEXT,
data13 TEXT,
data14 TEXT,
data15 TEXT,
data_sync1 TEXT, 
data_sync2 TEXT, 
data_sync3 TEXT, 
data_sync4 TEXT );

你得到错误,因为Android不给你访问直接添加联系人到你的联系人表。相反,你需要修改或添加一个原始联系人,Android会自动为你创建一个联系人。

最新更新