2015-09-06 4 views
2

Я пытаюсь получить телефонные номера из списка ContactsContract, которые не помечены для удаления.Извлечение телефонных номеров, которые не удалены из списка контактов Android

@Override 
public Loader onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(
      this, 
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ 
        ContactsContract.CommonDataKinds.Phone.NUMBER 
      }, 
      ContactsContract.CommonDataKinds.Phone.DELETED + "==0", 
      null, 
      null); 
} 

Однако я получаю ниже ошибки:

java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:304) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:818) 
Caused by: android.database.sqlite.SQLiteException: no such column: deleted (code 1): , while compiling: SELECT DISTINCT data1 FROM view_data data LEFT OUTER JOIN (SELECT data_usage_stat.data_id as STAT_DATA_ID, SUM(data_usage_stat.times_used) as times_used, MAX(data_usage_stat.last_time_used) as last_time_used FROM data_usage_stat GROUP BY data_usage_stat.data_id) as data_usage_stat ON (STAT_DATA_ID=data._id) WHERE (1 AND mimetype_id=5) AND ((deleted==0)) 
     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181) 
     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
     at android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 
     at android.content.ContentResolver.query(ContentResolver.java:478) 
     at android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 
     at android.content.CursorLoader.loadInBackground(CursorLoader.java:42) 
     at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) 
     at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) 
     at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:57) 
     at android.os.AsyncTask$2.call(AsyncTask.java:292) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 

The documentation for ContactsContract.CommonDataKinds.Phone.CONTENT_URI утверждает, что записи данных будут объединены с соответствующим контактом сырым и агрегатных контактных данных. Но «удаленных» нет. Почему и как я могу получить только номера телефонов, которые не удалены?

ответ

1

Прогноз URI данных не имеет столбца DELETED, в любом случае ваш запрос должен извлекать только телефонные номера контактов, которые не удаляются. Можете ли вы получить номера телефонов удаленных необработанных контактов?

+0

Интересно, что он нигде не документирован. Или я не могу его найти. Точно, когда вы спрашиваете через ContactsContract.CommonDataKinds.Phone.CONTENT_URI, вы получаете номера телефонов, которые не удаляются. – atakan

+1

Проверьте дискуссию под удалением, ее не очень прямолинейно, но вы должны иметь возможность получить изображение https://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html – iago

0

Я думаю, что вы делаете запрос против неправильной таблицы. Попробуйте изменить ContactsContract.CommonDataKinds.Phone.CONTENT_URI на ContactsContract.Contacts.CONTENT_URI

+0

Но в этом случае вы получите строку контактов, в которой нет номера телефона. Он имеет только столбец HAS_PHONE_NUMBER. И для каждого контакта вам нужно запрашивать связанные строки данных, чтобы получить номера телефонов. Именно этого я и стараюсь избегать. – atakan

0

Я столкнулся с той же проблемой и прекратил поиск быстрого решения для извлечения контактов.

public static List<ContactDTO> getPhone(Context context){ 
     List<ContactDTO> contactList = new ArrayList<ContactDTO>(); 
     ContentResolver cr = context.getContentResolver(); 
     String[] PROJECTION = new String[] { 
       ContactsContract.RawContacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.CommonDataKinds.Phone.PHOTO_URI, 
       ContactsContract.CommonDataKinds.Phone.NUMBER, 
       ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; 

     Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
     String filter = ""+ ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0 and " + Phone.TYPE +"=" + Phone.TYPE_MOBILE;  
     String order = ContactsContract.Contacts.DISPLAY_NAME + " ASC";// LIMIT " + limit + " offset " + lastId + ""; 

     Cursor phoneCur = cr.query(uri, PROJECTION, filter, null, order); 
     while(phoneCur.moveToNext()){ 
      ContactDTO dto = new ContactDTO(); 
      dto.setName("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
      dto.setMobileNo("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
      dto.setPhotoUrl("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI))); 
      dto.setContactId("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.CONTACT_ID))); 
      contactList.add(dto); 
     } 
     phoneCur.close(); 
     return contactList; 
} 

где ContactDTO - простой класс POJO.

Смежные вопросы