2017-01-24 1 views
0

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.

+0

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

+0

syncIndex est < 0, donc le résultat ne contient pas cette colonne – reini122

Répondre

3

La façon dont vous insérez la valeur semble correcte, mais la méthode qui lit la valeur ne l'est pas.

Vous ne pouvez pas interroger Contacts.CONTENT_URI et obtenir des champs de la table RawContacts.

Pour relire votre valeur, essayez ceci:

ContentResolver cr = this.getContentResolver(); 
String[] projection = new String[] { RawContacts._ID, RawContacts.CONTACT_ID, RawContacts.SYNC1 } 
String selection = RawContacts.ACCOUNT_TYPE + " = '" + accountType + "' AND " + RawContacts.ACCOUNT_NAME + " = '" + accountName + "'"; 
Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, projection, selection, null, null); 

while (cur.moveToNext()) { 
    Long rawId = cur.getLong(0); 
    Long contactId = cur.getLong(1); 
    String sync1 = cur.getString(2); 

    System.out.println("Contact id=" + contactId + " raw-id=" + rawId + " sync1=" + sync1); 
} 

cur.close(); 
+0

Cela a fonctionné, merci. J'ai amélioré la requête afin qu'elle soit sûre pour l'injection SQL, en utilisant le paramètre 'selectionArgs' et l'espace réservé'? 'Dans la sélection. – reini122