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

What does COLLATE LOCALIZED ASC stand for?

4

3 回答 3

30

Collate is just fancy speak for sort (well sort of). So this is sort ordering based on localized preferences (i.e. current language's alphabet and conventions) in ascending order.

于 2010-03-04T16:07:17.257 回答
22

它指示 SQLite 对非 ASCII 字符进行适当的排序。带有变音符号的字符(有些人称它们为重音符号)具有比字符 Z 更高的字节码,因此普通的 ASCII 排序不适合许多外语。

例如,大写 A 字符的字节码是0x41,大写 Z 字符的字节码是0x5A。然后我们有 Á(大写 A accute),Unicode 中的代码是0x00C1。因此,纯字节码排序会导致 Á 在 Z 之后。

但是在具有这种字符的语言中,惯例是把那些有变音符号的,就好像他们没有变音符号一样。所以 Á 应该和普通的 A 一起,至少在 B 之前。

为了说明,我们在下面有一个使用它们的字节码排序的名称列表:

  • 布伦达
  • 黛比
  • 乔治
  • 阿尔瓦罗
  • 埃里科

现在使用COLLATE LOCALIZED它将按字符的“基础”排序:

  • 阿尔瓦罗
  • 布伦达
  • 黛比
  • 埃里科
  • 乔治
于 2014-08-07T23:13:55.527 回答
12

COLLATE 是一个 SQL 运算符,可让您覆盖字符串的默认排序顺序。例如,“COLLATE NOCASE”进行不区分大小写的比较,“COLLATE BINARY”进行区分大小写的比较。

SQLite C 接口允许您定义自定义排序规则 ( http://www.sqlite.org/c3ref/create_collat​​ion.html )。

于 2010-03-06T04:44:50.077 回答