2010-03-04 13 views
28
private Cursor getContacts() 
    { 
     // Run query 
     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     String[] projection = new String[] { 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME 
     }; 
     String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
       (mShowInvisible ? "0" : "1") + "'"; 
     String[] selectionArgs = null; 
     String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

     return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
    } 

¿Qué significa COLLATE LOCALIZED ASC?¿Qué significa COLLATE LOCALIZED ASC?

Respuesta

30

Clasificar es simplemente elegante para ordenar (bien tipo de). Por lo tanto, este es un ordenamiento de clasificación basado en preferencias localizadas (es decir, el alfabeto y las convenciones del idioma actual) en asc orden de finalización.

+0

¿Tengo que definir nada adicional a mi esquema de tabla para poder usarlo? ¿Es este SQLite específico o solo Android específico? ¿Puedo ordenar por estas todas mis columnas personalizadas? – Pentium10

+0

El ASC significa ascendente. No tiene nada que ver con ASCII. –

12

COLLATE es un operador de SQL que le permite anular el orden de clasificación predeterminado para las cadenas. Por ejemplo, "COLLATE NOCASE" hace una comparación insensible a mayúsculas y "COLLATE BINARY" hace una comparación sensible a mayúsculas y minúsculas.

La interfaz SQLite C le permite definir colaciones personalizadas (http://www.sqlite.org/c3ref/create_collation.html).

19

Indica a SQLite que ordene correctamente los caracteres que no son ASCII. Los caracteres con signos diacríticos (algunos los llaman acentos) tienen códigos de bytes más altos que el carácter Z, por lo que un tipo ASCII simple no se ajustaría a muchos idiomas extranjeros.

Por ejemplo, el código de bytes de la capital A es 0x41 y la capital Z char es 0x5A. Luego tenemos el Á (capital A accute) cuyo código en Unicode es 0x00C1. Entonces, un ordenamiento de código de bytes simple daría como resultado el Á después de la Z.

Pero en los idiomas que tienen este tipo de caracteres la convención es poner aquellos con signos diacríticos como si no tuvieran el signo diacrítico. Por lo que el A debe estar junto a la llanura A, al menos antes de B.

Y para ilustrar, a continuación tenemos una lista de nombres ordenados utilizando su código de bytes:

  • Brenda
  • Debby
  • George
  • Álvaro
  • Érico

n w mediante el COLLATE LOCALIZED sería ordenar por la "base" del personaje:

  • Álvaro
  • Brenda
  • Debby
  • Érico
  • George
+3

Esto debería ser más votado, buena explicación con el ejemplo. –