Android 订单按日期描述时出现问题

Android 订单按日期描述时出现问题,android,sql,android-sqlite,Android,Sql,Android Sqlite,我创建了一个android sql数据库,开始时一切都很好 但我发现一个问题是,有人输入了2017/9/8这样的一天,而不是2017/9/08,我的按日期排序desc不起作用 这是我的表,我想按日期对行进行排序: 当日期为2017/8/7和2017/9/7时不工作 这是我的分拣日期代码: //排序日期:最新到旧日期 public List<Contact> sortingDate() { List<Contact> contactList = new Arra

我创建了一个android sql数据库,开始时一切都很好

但我发现一个问题是,有人输入了2017/9/8这样的一天,而不是2017/9/08,我的
按日期排序desc
不起作用

这是我的表,我想按日期对行进行排序:

当日期为2017/8/7和2017/9/7时不工作

这是我的分拣日期代码: //排序日期:最新到旧日期

public List<Contact> sortingDate() {
    List<Contact> contactList = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS +" ORDER BY " +"Date DESC",null);
    //looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setDate(cursor.getString(1));
            contact.setBeforeMorning(cursor.getString(2));
            contact.setAfterMorning(cursor.getString(3));
            contact.setBeforeNoon(cursor.getString(4));
            contact.setAfterNoon(cursor.getString(5));
            contact.setBeforeNight(cursor.getString(6));
            contact.setAfterNight(cursor.getString(7));
            System.out.println("The result is :" + cursor.getString(1));
            //Adding contact to list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }

    return contactList;
}

我想因为你是按字符串值排序


尝试类似于
orderbycast(dateas-Date)DESC

的方法,因为您是按字符串值排序的


尝试类似于按类型排序(日期为日期)DESC的操作

获取所有
数据
,无需任何排序,然后使用自定义
比较器在
列表上执行排序

class DateComparator implements Comparator<Contact>
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
    public int compare(Contact lhs, Contact rhs)
    {
        return dateFormat.parse(lhs.getDate()).compareTo(dateFormat.parse(rhs.getDate()));
    }
}
类DateComparator实现Comparator
{
SimpleDataFormat dateFormat=新的SimpleDataFormat(“yyyy/MM/dd”);
公共整数比较(联系lhs,联系rhs)
{
return dateFormat.parse(lhs.getDate()).compareTo(dateFormat.parse(rhs.getDate());
}
}
使用上述比较器按日期订购

List<Contact> contactList = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS,null);
    //looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setDate(cursor.getString(1));
            contact.setBeforeMorning(cursor.getString(2));
            contact.setAfterMorning(cursor.getString(3));
            contact.setBeforeNoon(cursor.getString(4));
            contact.setAfterNoon(cursor.getString(5));
            contact.setBeforeNight(cursor.getString(6));
            contact.setAfterNight(cursor.getString(7));
            System.out.println("The result is :" + cursor.getString(1));
            //Adding contact to list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }

Collections.sort(contactList, new DateComparator());
List contactList=new ArrayList();
SQLiteDatabase db=this.getWritableDatabase();
Cursor Cursor=db.rawQuery(“选择*自”+表_联系人,空);
//循环遍历所有行并添加到列表
if(cursor.moveToFirst()){
做{
触点=新触点();
setID(Integer.parseInt(cursor.getString(0));
contact.setDate(cursor.getString(1));
contact.setBeforeMorning(cursor.getString(2));
contact.setAfterMorning(cursor.getString(3));
contact.setbeforeon(cursor.getString(4));
contact.set午后(cursor.getString(5));
contact.setbeforeight(cursor.getString(6));
contact.setAfterNight(cursor.getString(7));
System.out.println(“结果是:”+cursor.getString(1));
//将联系人添加到列表中
联系人列表。添加(联系人);
}while(cursor.moveToNext());
}
Collections.sort(contactList,new DateComparator());

无需任何排序即可获取所有
数据
,然后使用自定义
比较器对
列表
执行排序

class DateComparator implements Comparator<Contact>
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
    public int compare(Contact lhs, Contact rhs)
    {
        return dateFormat.parse(lhs.getDate()).compareTo(dateFormat.parse(rhs.getDate()));
    }
}
类DateComparator实现Comparator
{
SimpleDataFormat dateFormat=新的SimpleDataFormat(“yyyy/MM/dd”);
公共整数比较(联系lhs,联系rhs)
{
return dateFormat.parse(lhs.getDate()).compareTo(dateFormat.parse(rhs.getDate());
}
}
使用上述比较器按日期订购

List<Contact> contactList = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_CONTACTS,null);
    //looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Contact contact = new Contact();
            contact.setID(Integer.parseInt(cursor.getString(0)));
            contact.setDate(cursor.getString(1));
            contact.setBeforeMorning(cursor.getString(2));
            contact.setAfterMorning(cursor.getString(3));
            contact.setBeforeNoon(cursor.getString(4));
            contact.setAfterNoon(cursor.getString(5));
            contact.setBeforeNight(cursor.getString(6));
            contact.setAfterNight(cursor.getString(7));
            System.out.println("The result is :" + cursor.getString(1));
            //Adding contact to list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }

Collections.sort(contactList, new DateComparator());
List contactList=new ArrayList();
SQLiteDatabase db=this.getWritableDatabase();
Cursor Cursor=db.rawQuery(“选择*自”+表_联系人,空);
//循环遍历所有行并添加到列表
if(cursor.moveToFirst()){
做{
触点=新触点();
setID(Integer.parseInt(cursor.getString(0));
contact.setDate(cursor.getString(1));
contact.setBeforeMorning(cursor.getString(2));
contact.setAfterMorning(cursor.getString(3));
contact.setbeforeon(cursor.getString(4));
contact.set午后(cursor.getString(5));
contact.setbeforeight(cursor.getString(6));
contact.setAfterNight(cursor.getString(7));
System.out.println(“结果是:”+cursor.getString(1));
//将联系人添加到列表中
联系人列表。添加(联系人);
}while(cursor.moveToNext());
}
Collections.sort(contactList,new DateComparator());

警告:您即将看到的SQLite查询很难看,不应该在家里重复,除非您完全弄乱了日期格式,在这种情况下,您可能别无选择

我们可以尝试通过
创建一个
订单,为每个日期构建正确的两位数月和日。请注意,对于您的数据,这就需要将一位数的月份和天数填充为零

SELECT *
FROM contacts
ORDER BY
    SUBSTR(Date, 1, 4) DESC,
    CASE WHEN INSTR(SUBSTR(Date, 6), '/') = 2
         THEN '0' || SUBSTR(Date, 6, 1)
         ELSE SUBSTR(Date, 6, 2) END DESC,
    CASE WHEN LENGTH(SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)) = 1
         THEN '0' || SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)
         ELSE SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1) END DESC;
请注意,正确的长期解决方案是将所有月份和天数存储为两位数,如果是个位数,则在左侧用零填充(您的年份很可能总是4位数)

下面是演示上述查询逻辑的演示的链接。请注意,我使用MySQL创建它,因为不支持SQLite,但除了必须用
CONCAT
替换
|
之外,查询是相同的

以下是显示正确顺序以及正确提取的年、月和日组件的输出:


警告:您即将看到的SQLite查询很难看,不应该在家里重复,除非您完全弄乱了日期格式,在这种情况下,您可能别无选择

我们可以尝试通过
创建一个
订单,为每个日期构建正确的两位数月和日。请注意,对于您的数据,这就需要将一位数的月份和天数填充为零

SELECT *
FROM contacts
ORDER BY
    SUBSTR(Date, 1, 4) DESC,
    CASE WHEN INSTR(SUBSTR(Date, 6), '/') = 2
         THEN '0' || SUBSTR(Date, 6, 1)
         ELSE SUBSTR(Date, 6, 2) END DESC,
    CASE WHEN LENGTH(SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)) = 1
         THEN '0' || SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1)
         ELSE SUBSTR(SUBSTR(Date, 6), INSTR(SUBSTR(Date, 6), '/') + 1) END DESC;
请注意,正确的长期解决方案是将所有月份和天数存储为两位数,如果是个位数,则在左侧用零填充(您的年份很可能总是4位数)

下面是演示上述查询逻辑的演示的链接。请注意,我使用MySQL创建它,因为不支持SQLite,但除了必须用
CONCAT
替换
|
之外,查询是相同的

以下是显示正确顺序以及正确提取的年、月和日组件的输出:


日期的数据类型是什么?提示:如果是
(n)varchar
,这就是问题所在。请参阅SQLite没有正式的日期类型,即您的日期存储为文本。您正确地将日期存储在ISO格式中