Android 订单按日期描述时出现问题
我创建了一个android sql数据库,开始时一切都很好 但我发现一个问题是,有人输入了2017/9/8这样的一天,而不是2017/9/08,我的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
按日期排序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格式中