Cursorloader 排序顺序按字母顺序然后数字

Cursorloader sort order alphabetical then numeric

从联系人 table 中提取数据时,是否可以先按字母顺序对结果进行排序,然后再按数字排序?

代码片段:

    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");

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

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

并且您希望 Fred 在 01 23456 7890 之前出现,但让 Alan 在 Fred 之前出现,那么一种方法是引入一种检测值是否为数字的方法。这可以通过尝试使用 CAST 将值转换为数字(本例中为整数)来实现。

所以不是 :-

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

结果是:-

您可以按照以下方式使用:-

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

这会产生:-

备注

  • 已包含转换后的列以供说明。
    • 这表明字母值如何从 CAST 中得出 0,从而使其成为排序的最高顺序,而数值(0 除外)
  • 您可能需要调整以上内容,但基本上原则适用