Pregunta

Solo algunas preguntas en las que pensé que podría usar algo de luz. Hasta ahora tengo una aplicación que consulta la base de datos de Contactos de Android para ciertos tipos de datos (actualmente display_name, número y dirección). Entonces quiero llenar una vista de lista con los resultados de mis consultas de cursor. Mi problema es que he usado 3 cursores separados para obtener los datos, y quiero unir los 3 conjuntos a las entradas que tengo en mi fila ListView (R.ID.Contact_Name, R.ID.Contact_Number, R.ID. dirección de contacto).

No estoy seguro de cómo hacer esto con 3 cursores diferentes, y después de mirar a los últimos días no pude encontrar ninguna guía real, excepto algunas frases lanzadas como usar "MergeCursor?" (SP) o intentarlo para unirse a las tablas de la base de datos. Además, no quiero poblar mi lista dentro de OnCreate (). Quiero hacerlo dentro de DoinBackground () de AsyncTask ya que algunos usuarios pueden tener muchos, muchos contactos y no quiero bloquear el hilo de la interfaz de usuario ... lo que ya está sucediendo. Pero cuando intenté implementar la población en un asíncrono, Eclipse me da toneladas de errores sobre mi SimpleCursorDapter. Aquí está mi código actual. Cualquier orientación sobre cómo mejorar esta arquitectura y resolver los problemas que tengo sería muy apreciado, ¡gracias!

      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();
}

}

¿Fue útil?

Solución

MergeCursor es más para concatonar los resultados de una consulta con los resultados de otra. Piense en ello como más filas, no más columnas.

Si estás sacando de varias fuentes porque quieres columnas De cada consulta (número de teléfono de uno, dirección de otro), lo que desea usar es un Cursorjoiner. Un cursorjoiner le permitirá tomar dos cursores ordenados por la misma clave primaria y crear un nuevo cursor con las columnas que desee de cada cursor principal. Se incluye una breve descripción de cómo hacer en la documentación vinculada.

¡Buena suerte!

EDITAR: Para responder al bit acerca de ejecutar la consulta en un hilo separado, un buen lugar para comenzar sería leer Cargadores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top