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