Android заполняет список с помощью нескольких курсоров - PullRequest
1 голос
/ 06 декабря 2011

всего несколько вопросов, на которые, как мне показалось, я мог бы использовать свет. Пока у меня есть приложение, которое запрашивает базу данных контактов Android для определенных типов данных (в настоящее время DISPLAY_NAME, NUMBER и ADDRESS). Затем я хочу заполнить ListView с результатами моих запросов курсора. Моя проблема в том, что я использовал 3 отдельных курсора для извлечения данных, и я хочу связать все 3 набора с записями, которые есть в моей строке ListView (R.id.contact_name, R.id.contact_number, R.id. Контактный адрес).

Я не уверен, как это сделать с 3 различными курсорами, и, оглянувшись на последние пару дней, я не смог найти никакого реального руководства, за исключением нескольких фраз, например, с использованием «MergeCursor?» (Sp ) или пытается объединить таблицы базы данных вместе. Кроме того, я не хочу заполнять мой список внутри onCreate (). Я хочу сделать это внутри doInBackground () AsyncTask, так как у некоторых пользователей может быть много-много контактов, и я не хочу блокировать поток пользовательского интерфейса ... что уже происходит. Но когда я попытался реализовать заполнение в асинхронном режиме, Eclipse выдает мне массу ошибок о моем SimpleCursorAdapter. Вот мой текущий код. Спасибо за любые советы, как улучшить эту архитектуру и решить возникающие у меня проблемы, спасибо!

      public class Contacts extends ListActivity {

     private static final String TAG = "Contacts";

     Cursor c, pCur, addrCur;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Uri contacts = ContactsContract.Contacts.CONTENT_URI;
    ContentResolver cr = getContentResolver();

    String[] projection = new String[] { ContactsContract.Data.DISPLAY_NAME };
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
    Log.d(TAG, "Getting Display Names....");

    // Query the Contacts Content Provider for ONLY Contacts that have phone
    // numbers
    // listed

    c = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, null,
            sortOrder);
    // Get their display names
    if (c.getCount() > 0) {
        // While there is more data
        while (c.moveToNext()
                && Integer
                        .parseInt(c.getString(c
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            String id = c.getString(c
                    .getColumnIndex(ContactsContract.Contacts._ID));

            String name = c
                    .getString(c
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            // Query Phone Numbers Next

            /*
             * if (Integer .parseInt(c.getString(c
             * .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))
             * > 0) { Log.d(TAG, "Getting Phone Numbers"); pCur = cr.query(
             * ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
             * ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?" ,
             * new String[]{id}, null); while (pCur.moveToNext()) {
             * 
             * String phone_number = pCur .getString(pCur
             * .getColumnIndex(ContactsContract
             * .CommonDataKinds.Phone.NUMBER)); } pCur.close(); Log.d(TAG,
             * "Finished Getting Phone Numbers...."); }
             */

            // Query the Addresses
            Log.d(TAG, "Getting Addresses....");
            String addrWhere = ContactsContract.Data.CONTACT_ID
                    + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";

            String[] addWhereParams = new String[] {
                    id,
                    ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE };

            addrCur = cr.query(ContactsContract.Data.CONTENT_URI, null,
                    null, null, null);

            while (addrCur.moveToNext()) {
                String poBox = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));

                String street = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));

                String city = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));

                String state = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));

                String postalCode = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));

                String country = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));

                String type = addrCur
                        .getString(addrCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));

            }
            addrCur.close();
            Log.d(TAG, "Finished Getting Addresses....");

        }
    }
    // new loadContacts().execute(TAG);
    final int[] TO = { R.id.contact_name };
    final String[] FROM = new String[] { ContactsContract.Contacts.DISPLAY_NAME };

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.contact_item, c, FROM, TO);
    setListAdapter(adapter);
    // adapter.changeCursor(pCur);


}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
     c.moveToPosition(position);

     String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

     Toast.makeText(this, "You Selected  " + name, Toast.LENGTH_SHORT).show();





    //Toast t = Toast.makeText(Contacts.this, "You Selected  " + position, Toast.LENGTH_SHORT);
    //t.show();
}

}

1 Ответ

0 голосов
/ 06 декабря 2011

MergeCursor больше для объединения результатов одного запроса с результатами другого. Думайте об этом как о количестве строк, а не столбцов.

Если вы извлекаете данные из нескольких источников, так как вы хотите столбцы для каждого запроса (номер телефона от одного, адрес от другого), вам нужно использовать CursorJoiner . CursorJoiner позволит вам взять два курсора, отсортированные по одному и тому же первичному ключу, и создать новый курсор с нужными столбцами из каждого родительского курсора. Краткий обзор с практическими рекомендациями включен в связанную документацию.

Удачи!

РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос о выполнении запроса в отдельном потоке, хорошее место для начала было бы прочитать о Loaders .

...