Je voudrais créer une application qui synchronise les contacts d'un serveur donné. Pour identifier ces contacts, je voudrais stocker un identifiant dans le contact Android dans un champ caché.Stocker l'identifiant de synchronisation cachée dans le contact brut android
J'ai trouvé le champ SYNC1 qui semble approprié pour cela, mais je n'ai aucune idée de comment utiliser ce champ correctement.
je tenté de mettre de la manière suivante:
ArrayList<ContentProviderOperation> ops =
new ArrayList<>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, ACCOUNT_NAME)
.withValue(ContactsContract.RawContacts.SYNC1, "myInternalId")
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Test User")
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
La question est maintenant, que l'insertion de lot traverse, mais le champ est pas défini dans le contact, car il est vide lorsque je tente lire après coup:
ContentResolver cr = this.getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(
ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
String sync1 = null;
int sync1Index = cur.getColumnIndex(ContactsContract.RawContacts.SYNC1);
if (sync1Index >= 0) {
sync1 = cur.getString(sync1Index);
}
System.out.println("Contact id=" + id + " name=" + name + " sync1=" + sync1);
}
}
cur.close();
Si je veux le mettre en contact brut, donc dans le deuxième lot, je reçois une exception.
est vide ou sync1Index <0? ... passer null comme second paramètre de requête n'est pas une bonne idée ... mieux vaut passer les colonnes que vous obtenez wana ... aussi vous obtenez tous les contacts avec votre requête non seulement celle de votre type de compte – Selvin
syncIndex est < 0, donc le résultat ne contient pas cette colonne – reini122