Cursorloader排序顺序按字母顺序排列,然后是数字

时间:2018-02-05 13:50:06

标签: android android-sqlite android-contentprovider android-cursorloader

是否可以按字母顺序对结果进行排序,然后在从“联系人”表中提取数据时以数字方式对数据进行排序?

代码段:

    cursorLoader.setSortOrder(
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC, " +
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " ASC, " +
                    ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC, " +
                    ContactsContract.CommonDataKinds.Phone.IS_PRIMARY + " DESC");

这导致数字值出现在字母值

之前

1 个答案:

答案 0 :(得分:1)

如果您的意思是显示名称可以包含数字和名称,并且您希望数字显示在最后,例如

enter image description here

你希望弗雷德出现在01 23456 7890之前,但是说艾伦出现在弗雷德之前,那么一种方法就是引入一种检测价值是否为数字的方法。这可以通过尝试使用CAST将值转换为数字(在此示例中为整数)来实现。

所以而不是: -

SELECT * FROM phonedata ORDER BY display_name ASC, contact_id ASC, is_super_primary DESC, is_primary DESC

导致: -

enter image description here

您可以使用以下内容: -

SELECT 
    CAST(replace(display_name,' ','') AS INTEGER) AS converted,
    * 
FROM phonedata 
ORDER BY CAST(replace(display_name,' ','') AS INTEGER) ASC,  
    display_name ASC, 
    contact_id ASC, 
    is_super_primary DESC, 
    is_primary DESC

这会产生: -

enter image description here

注释

  • 已包含已转换的列以供说明。
    • 这就是它显示了一个字母值将如何从CAST产生0,从而使其成为排序的最高顺序,而数字值(0除外)
  • 您可能需要定制以上内容,但基本上适用原则