2011-03-11 20 views
19

Tengo una utilidad de "volcado" que estoy usando para estudiar el ContactsContract ya que no lo consigo en la documentación. Cuando vuelco los contactos, cuenta 263 registros en la tabla, sin embargo, la aplicación de contactos en mi dispositivo enumera que tengo 244 ("Mostrando 244 contactos")¿Cuál es la diferencia en contactos versus contactos sin formato?

¿Puede alguien explicar la discrepancia?

My Sprint LG's Contacts App tiene opciones de visualización para cada una de las cuentas que sincronizo y las he revisado todas, por lo que no debería haber ningún filtro.

La principal URI que estoy usando en la utilidad es:

Uri uriRawContacts = ContactsContract.RawContacts.CONTENT_URI; 
    String[] projection = new String [] { 
      ContactsContract.RawContactsEntity._ID, 
      ContactsContract.RawContactsEntity.CONTACT_ID, 
      ContactsContract.RawContactsEntity.DELETED, 
      ContactsContract.RawContactsEntity.AGGREGATION_MODE, 
    }; 
    Cursor cursorRaw = cr.query(uriRawContacts, projection, null, null, null); 
    DumpCursor.dumpAnyCursor(getApplicationContext(), "RawContacts", cr, cursorRaw, ","); 

Seguido por (para cada _ID en la consulta anterior):

   long rawContactId = Long.parseLong(anyCursor.getString(anyCursor.getColumnIndex(RawContacts.CONTACT_ID))); 

       Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 
       Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY); 

       Log.d(TAG, "rawContactUri: " + rawContactUri.toString()); 
       Log.d(TAG, "entityUri: " + entityUri.toString()); 

       Cursor c = cr.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null); 

I a continuación, bucle a través de la primera consulta, mostrar todas las columnas en mi proyección, luego, usando el campo _ID en el primer bucle de consulta, emite la segunda consulta y vuelco todas sus columnas.

balas de la respuesta transpuesta aquí por conveniencia: Consulte la referencia para una explicación más detallada. Más específicamente, le recomendamos leer sobre las reglas de agregación. Ref: Click here for the original cited text that follows

  • La base de datos de contactos se divide en 3 mesas contactos, primas contactos y datos.
  • Cada tabla contiene la columna (_ID) que es una clave primaria auto incrementada
    .
  • mesa Los datos contiene toda la información de contacto como número de teléfono, correo electrónico de identificación, dirección, etc.
  • Los contactos primas apunta al contacto real creado. Por lo tanto, usamos los contactos brutos mientras agregamos un contacto .
  • El usuario no puede agregar ningún dato en la tabla de contactos. Los datos en esta tabla
    se llenan internamente debido a la agregación de contactos
    .

La razón lógica trabajó durante algún de los contactos es: _ID para los contactos, contactos primas sigue siendo igual hasta que es cualquier agregación de contacto teniendo lugar . Digamos que agrega dos contactos con el mismo nombre abc. Aquí _ID para incrementos contactos primas dos veces mientras _ID para incrementos de contactos sólo una vez, ya que estos dos contactos consigue fusionaron debido a la agregación de contactos

+0

La última edición aprobada fue incorrecta. Si lees el original, verás la puntuación faltante y el énfasis en las 3 tablas. Luego hace una referencia a eso ya que "La tabla de datos, 'contactos' contiene todos los ..." Ha modificado las declaraciones correctas del autor original. – mobibob

Respuesta

22

Esta diferencia se debe a RawContacts conseguir fusionaron para Contacts debido a la agregación regla.

Agregue contacto a RawContacts mientras la lista muestra Contactos. De ahí la diferencia de conteo.

Por favor, encuentre alguna descripción entre Contacts, RawContacts y Datahere. Aunque la pregunta es diferente, es posible que pueda obtener la diferencia entre Contacts y RawContacts.

+1

Súper respuesta y +1. Creo que la información es lo suficientemente importante como para referirme y transponer las seis viñetas de esa respuesta a esta Q & A. – mobibob

3

Las tres tablas se conocen comúnmente por los nombres de sus clases de contrato. Las clases definen constantes para los URI de contenido, nombres de columna y valores de columna utilizados por las tablas:

ContactsContract.Contacts tabla: - Filas que representan diferentes personas, basadas en agregaciones de filas de contacto sin formato.

ContactsContract.RawContacts tabla: - Filas que contienen un resumen de los datos de una persona, específicos de una cuenta de usuario y tipo.

ContactsContract.Data tabla: - Filas con los detalles del contacto sin formato, como direcciones de correo electrónico o números de teléfono.

para obtener más información click

+0

supongamos que quiero obtener la identificación que usan las aplicaciones para abrir intentos de chat, como viber, ¿cómo hago eso? Por ejemplo, si Viber tiene un contacto X, tiene una ID para Y, que se usa para abrir un intento de chat con este contacto, usando: intent = new Intent (Intent.ACTION_VIEW, Uri.parse ("content://com.android.contacts/data/"+id)); intent.setPackage ("com.viber.voip"); –

+0

ver este enlace http://stackoverflow.com/a/35453979/4395114 –

+0

No encuentro la identificación necesaria para esto. ¿Puedes ayudarme? Hice una publicación al respecto aquí: http://stackoverflow.com/q/35972329/878126 –

Cuestiones relacionadas