2010-06-02 11 views
9

Ich stand vor dem Problem, Kontakte auf Android 2.0 und höher zu aktualisieren/einfügen. Es gibt kein Problem, einen neuen Kontakt einzufügen, wenn das Telefonbuch leer ist, aber wenn ich es getan habe 2. mal einige Dateien wie TEL, EMAIL sind verdoppelt und ausgelöst usw. aber N, FN, ORG sind in Ordnung (eine Kopie).Verwenden von ContentProviderOperation zum Aktualisieren und Einfügen von Kontakten

Nach Erhalt und Beratung von anderen Mitglied dieses Forum habe ich zuerst einen Kontakt aktualisiert und dann ContentProviderResult [] zurückgegeben uri's mit null dann mache ich eine Einfügen Aktion und es ging ok, aber danach habe ich ein Update und alle Kontakte aggregiert in eins - ich habe 1 Kontakt insted 3, der im Telefonbuch bestand. Dieser wurde beschädigt, die Kontaktfelder sind zufällig aufgebaut.

Ich setze Google-Konto.

Code:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) 
    .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED) 
    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) 
    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) 
    .build()); 

// add name 
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); 
    builder.withValue(ContactsContract.Data.MIMETYPE, 
    ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); 
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, name); 

// phones 
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 
    builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0); 
    builder.withValue(ContactsContract.Data.MIMETYPE, 
    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneValue); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType); 
    builder.withValue(ContactsContract.CommonDataKinds.Phone.LABEL, phoneLabel);   
    ops.add(builder.build()); 

// emails ... 
// orgs ... 

try { 

    ContentProviderResult[] result = mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops); 
} 
    } catch (Exception e) { 
    Log.e(LOG_TAG, "Exception while contact updating: " + e.getMessage()); 
    } 

Was in dieser Lösung ist falsch? Wie funktioniert die Aggregations-Engine?

Ich werde mich freuen für Hilfe.

Bogus

Antwort

1

traf ich die gleichen problem.I denke, es auf diese Weise

opt.add(ContentProviderOperation.newUpdate(ContactsContract.Contacts.CONTENT_URI) 
       .withSelection(ContactsContract.Contacts._ID, new String[]{entity.getPeople()}) 
       .withValue(ContactsContract.Contacts.DISPLAY_NAME, "daerba") 
       .build() 
     ); 

Aber es ging schief und melden Sie dies funktionieren sollte.

android.database.sqlite.SQLiteException: bind oder Spaltenindex aus Bereich

ich da denken muss eine Auswahl sein, ein contact.So die withSelection zu aktualisieren ist wichtig, die ContentResolver zu sagen, was Kontakt zum Aktualisieren.

In der Hoffnung, dies kann einen Hinweis geben.

+4

withSelection erfordert Parameter, die mit '?' für den String []
dh .withSelection (ContractsContract.Contacts._ID + "=?", new String [] { "5"})
Wenn Sie nicht haben Sie irgendwelche '? ist da gibt es nichts um die String [] -Werte an ... zu binden –

+0

@wiseideal Danke für den Zeiger in die richtige Richtung. Die Auswahl war sicherlich mein Problem. – Bwire

0

Sie definieren den Builder neu, ohne ihn zu ops hinzuzufügen, daher werden die Daten nie nach Namen gesendet, was erklärt, warum Ihre Aggregation so seltsam ist.

// add name 
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 

// phones 
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 

auch wegen der Lesbarkeit bevorzugen i das folgende Format zu verwenden, wenn mit kleineren Chargen zu tun ....

ArrayList<ContentProviderOperation> batchOp = new ArrayList<ContentProviderOperation>(); 
batchOp.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType).build()); 
1

Sie müssen liefern where-Klausel für jede ContentProviderOperation wenn Sie ein Update machen wollen Siehe here und here.

Verwandte Themen