Error inserting account_id=2 contact_id=null _id=824 starred=1 - Batch Adding Contacts - Android

StackOverflow https://stackoverflow.com/questions/21777976

문제

I'm trying to add contacts to the contact list in a batch. I can do it successfully except when I add the Starred field to the batch list. So the problem must be there.

Here is my ArrayList code for the Starred field.

if(starred == true)
{

    operations.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValueBackReference(RawContacts._ID, 0)
                .withValue(RawContacts.STARRED, "1")
                .build());
}

And later on I do:

final ContentProviderResult[] result = contentResolver.applyBatch(ContactsContract.AUTHORITY, operations);

if(result.length == operations.size())
{
        Log.d(TAG, "Contact added!");
}

Here is the exception generated. I understand the exception but I don't see where that is happening in the ops.add(...) but it is there for sure, I just can't find it.

02-14 00:05:54.675: E/SQLiteDatabase(1508): Error inserting account_id=2 contact_id=null _id=824 starred=1
02-14 00:05:54.675: E/SQLiteDatabase(1508): android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at com.android.providers.contacts.ContactsProvider2.insertRawContact(ContactsProvider2.java:2661)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:2450)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at com.android.providers.contacts.AbstractContactsProvider.insert(AbstractContactsProvider.java:136)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2089)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.content.ContentProviderOperation.apply(ContentProviderOperation.java:214)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at com.android.providers.contacts.AbstractContactsProvider.applyBatch(AbstractContactsProvider.java:237)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at com.android.providers.contacts.ContactsProvider2.applyBatch(ContactsProvider2.java:2225)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.content.ContentProvider$Transport.applyBatch(ContentProvider.java:260)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:185)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at android.os.Binder.execTransact(Binder.java:404)
02-14 00:05:54.675: E/SQLiteDatabase(1508):     at dalvik.system.NativeStart.run(Native Method)
02-14 00:05:54.734: W/ContactsDatabaseHelper(1508): invalidateAllCache: [ContactsDatabaseHelper]
02-14 00:05:54.742: E/DatabaseUtils(1508): Writing exception to parcel
02-14 00:05:54.742: E/DatabaseUtils(1508): android.content.OperationApplicationException: insert failed
02-14 00:05:54.742: E/DatabaseUtils(1508):  at android.content.ContentProviderOperation.apply(ContentProviderOperation.java:216)
02-14 00:05:54.742: E/DatabaseUtils(1508):  at com.android.providers.contacts.AbstractContactsProvider.applyBatch(AbstractContactsProvider.java:237)
02-14 00:05:54.742: E/DatabaseUtils(1508):  at com.android.providers.contacts.ContactsProvider2.applyBatch(ContactsProvider2.java:2225)
02-14 00:05:54.742: E/DatabaseUtils(1508):  at android.content.ContentProvider$Transport.applyBatch(ContentProvider.java:260)
02-14 00:05:54.742: E/DatabaseUtils(1508):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:185)
02-14 00:05:54.742: E/DatabaseUtils(1508):  at android.os.Binder.execTransact(Binder.java:404)
02-14 00:05:54.742: E/DatabaseUtils(1508):  at dalvik.system.NativeStart.run(Native Method)

EDIT:

This is my first insertion to the ArrayList:

operations.add(ContentProviderOperation.newInsert(
                            ContactsContract.RawContacts.CONTENT_URI)
                            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                            .build());
도움이 되었습니까?

해결책 2

Solved my problem.

I must have the starred in the first operation.

Like this:

operations.add(ContentProviderOperation.newInsert(
                            ContactsContract.RawContacts.CONTENT_URI)
                            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                            .withValue(RawContacts.STARRED, strStarred)
                            .build());

And remove this:

if(starred == true) {

    operations.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValueBackReference(RawContacts._ID, 0)
                .withValue(RawContacts.STARRED, "1")
                .build());
}

다른 팁

On the second line of your error log it states PRIMARY KEY must be unique.

What is your primary key here, and are you sure it is indeed unique?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top