0

J'essaie d'obtenir tous les contacts d'un type spécifique du téléphone comme suit:ContentProvider (contacts) - pas de colonne: metadata_dirty

Cursor cursor = context.getContentResolver().query(
      ContactsContract.RawContacts.CONTENT_URI, 
      null, 
      ContactsContract.RawContacts.ACCOUNT_TYPE + "='com.whatsapp'", 
      null, 
      ContactsContract.RawContacts.CONTACT_ID + " ASC"); 

Mais cette ligne jette déjà une exception (ROM personnalisé, nougats => peut-être que c'est lié à ça?). J'ai seulement eu cette erreur d'un utilisateur et je suis coincé ici, est-ce que quelqu'un sait comment résoudre cela? Existe-t-il une alternative pour interroger tous les contacts?

Mon exception ressemble à ce qui suit:

Exception: android.database.sqlite.SQLiteException: no such column: metadata_dirty (code 1): , while compiling: 
SELECT sort_key, send_to_voicemail, pinned, display_name, metadata_dirty, 
phonebook_label_alt, version, phonebook_bucket, _id, custom_ringtone, 
times_contacted, account_type_and_data_set, sync4, dirty, sync2, 
contact_id, raw_contact_is_user_profile, aggregation_mode, data_set, 
phonebook_label, account_type, sync3, display_name_alt, phonetic_name, 
last_time_contacted, display_name_source, backup_id, sort_key_alt, 
phonebook_bucket_alt, deleted, starred, account_name, sync1, sourceid, 
phonetic_name_style 
FROM view_raw_contacts_restricted AS view_raw_contacts 
WHERE (1) 
AND ((account_type='com.whatsapp')) 
ORDER BY contact_id ASC 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java) 
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java) 
    at android.content.ContentProviderProxy.query(ContentProviderNative.java) 
    at android.content.ContentResolver.query(ContentResolver.java) 
    at android.content.ContentResolver.query(ContentResolver.java) 
    ... 

Répondre

1

Je ne vois rien de mal avec votre requête, il semble que cela est un bug interne dans la ROM personnalisée de l'utilisateur.

METADATA_DIRTY est une nouvelle colonne dans Android N: https://developer.android.com/reference/android/provider/ContactsContract.RawContactsColumns.html#METADATA_DIRTY

Il semble donc que le système est Nougat, mais le Contacts DB est basé sur une ancienne version de Android.

+0

C'est intéressant. Cela signifie que si l'utilisateur restaure sa base de contacts avec une application racine comme la sauvegarde titanium, il peut créer un ancien fichier de base de données pour les contacts où cette colonne est manquante (MAIS, son système android pensera qu'il existe et créera une requête cela ne fonctionne pas avec le fichier de base de données sous-jacent) ... Je vais vérifier que – prom85

+0

oui, certainement, j'ai vu une tonne de problèmes par les utilisateurs utilisant la sauvegarde en titane et similaire, ils peuvent facilement casser. – marmor

+0

merci, cela fait tout à fait sens et je suis tout à fait sûr que c'est ce qui se passe ... J'essaie de l'éviter en définissant explicitement les champs dans ma requête dont j'ai besoin, cela aidera déjà. Mais cela explique la cause profonde. Merci – prom85