如何按日期时间和整数对游标进行排序
How can order the cursor by datetime and Integer
我正在尝试先按 DateTime 然后按整数 ID 对生成的游标进行排序。
如果我单独按 DateTime 订购,它工作正常,如果我单独按 Integer ID 订购,它也工作正常。
到目前为止我已经尝试过:我尝试将 ASC 附加到整数 ID 排序。 (我知道这是默认设置,但值得一试)。
任何人都可以解释为什么 SQL 不按我的意愿订购吗?
这是我的 table 作品:
String sqlToCreateUnallocatedCalls = String
.format("create table %s ( %s INTEGER primary key, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT" +
", %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s INTEGER, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)",
TABLEUNALLOCATEDCALLS, C_ID_UNALLOCATED_CALL, C_UNALLOCATED_CALL_CALLID,
C_UNALLOCATED_CALL_START_DATE, C_UNALLOCATED_CALL_END_DATE, C_UNALLOCATED_CALL_DURATION, C_UNALLOCATED_CALL_CLIENTID,
C_UNALLOCATED_CALL_CLIENTSURNAME, C_UNALLOCATED_CALL_CLIENTFORENAME, C_UNALLOCATED_CALL_CARERID, C_UNALLOCATED_CALL_CARERSURNAME,
C_UNALLOCATED_CALL_CARERFORENAME, C_UNALLOCATED_CALL_NEEDNAME, C_UNALLOCATED_CALL_RUNNAME, C_UNALLOCATED_CALL_RUNID,
C_UNALLOCATED_CALL_CARERAWAYREASON, C_UNALLOCATED_CALL_NOTES, C_UNALLOCATED_CALL_CLIENTKEYSAFE, C_UNALLOCATED_CALL_CLIENTENTRYMETHOD,
C_UNALLOCATED_CALL_ISHEADER, C_UNALLOCATED_CALL_ISDATEHEADER, C_UNALLOCATED_CALL_STARTTIME);
db.execSQL(sqlToCreateUnallocatedCalls);
Log.e(TAG, "onUpgrade " + sqlToCreateUnallocatedCalls);
我想在 C_UNALLOCATED_CALL_STARTDATE 前订购,然后在 C_UNALLOCATED_CALL_RUNID 前订购。
startdate 为文本,runid 为整数。
这是我的查询:
String sql = "SELECT * FROM " + TABLEUNALLOCATED_CALL + " where " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ORDER BY "
+ LoginValidate.C_UNALLOCATED_CALL_START_DATE + " DESC , " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " ASC";
Cursor c = nfcAppObj.getDb().rawQuery(sql, null);
这是结果的屏幕截图:
如您所见,日期是有序的,但 runID 不是。它们应该是 4、12、12 或 12、12、4 而不是 12、4、12。
谢谢
[编辑 1]
我已经从数据库 return 直接检查了游标内容,在它传回 cursorLoader 之前。
String sql = "SELECT * FROM " + TABLEUNALLOCATED_CALL + " where " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ORDER BY "
+ LoginValidate.C_UNALLOCATED_CALL_START_DATE + " DESC , " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " ASC";
Cursor c = nfcAppObj.getDb().rawQuery(sql, null);
if(c != null){
if(c.moveToFirst()){
do{
//String runid = c.getString(c.getColumnIndex(LoginValidate.C_UNALLOCATED_CALL_RUNID));
int runid = c.getInt(c.getColumnIndex(LoginValidate.C_UNALLOCATED_CALL_RUNID));
Log.e(TAG, "runid = " + runid);
}while(c.moveToNext());
}
结果:
2021-04-28 13:15:22.547 794-7944/com.xxx.x E/RR3ContentProvider: runid = 12
2021-04-28 13:15:22.547 6794-7944/com.xxx.x\ E/RR3ContentProvider: runid = 4
2021-04-28 13:15:22.547 6794-7944/com.xxx.x E/RR3ContentProvider: runid = 12
2021-04-28 13:15:22.547 6794-7944/com.xxx.x E/RR3ContentProvider: runid = 11
[编辑 2]
String selection = LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ";
String sort = LoginValidate.C_UNALLOCATED_CALL_START_DATE + " ASC , " + LoginValidate.C_UNALLOCATED_CALL_RUNID;
cursorLoader = new CursorLoader(this, RR3ContentProvider.CONTENT_URI_UNALLOCATEDCALLS, projection, selection, null,
sort );
LoginValidate.C_UNALLOCATED_CALL_START_DATE
列同时包含日期和时间。
如果只想按日期部分排序,请使用函数 DATE()
:
String sql = "SELECT * FROM " + TABLEUNALLOCATED_CALL + " where " +
LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ORDER BY DATE(" +
LoginValidate.C_UNALLOCATED_CALL_START_DATE + ") DESC, " +
LoginValidate.C_UNALLOCATED_CALL_RUNID + " ASC";
我正在尝试先按 DateTime 然后按整数 ID 对生成的游标进行排序。
如果我单独按 DateTime 订购,它工作正常,如果我单独按 Integer ID 订购,它也工作正常。
到目前为止我已经尝试过:我尝试将 ASC 附加到整数 ID 排序。 (我知道这是默认设置,但值得一试)。
任何人都可以解释为什么 SQL 不按我的意愿订购吗?
这是我的 table 作品:
String sqlToCreateUnallocatedCalls = String
.format("create table %s ( %s INTEGER primary key, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT" +
", %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s INTEGER, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)",
TABLEUNALLOCATEDCALLS, C_ID_UNALLOCATED_CALL, C_UNALLOCATED_CALL_CALLID,
C_UNALLOCATED_CALL_START_DATE, C_UNALLOCATED_CALL_END_DATE, C_UNALLOCATED_CALL_DURATION, C_UNALLOCATED_CALL_CLIENTID,
C_UNALLOCATED_CALL_CLIENTSURNAME, C_UNALLOCATED_CALL_CLIENTFORENAME, C_UNALLOCATED_CALL_CARERID, C_UNALLOCATED_CALL_CARERSURNAME,
C_UNALLOCATED_CALL_CARERFORENAME, C_UNALLOCATED_CALL_NEEDNAME, C_UNALLOCATED_CALL_RUNNAME, C_UNALLOCATED_CALL_RUNID,
C_UNALLOCATED_CALL_CARERAWAYREASON, C_UNALLOCATED_CALL_NOTES, C_UNALLOCATED_CALL_CLIENTKEYSAFE, C_UNALLOCATED_CALL_CLIENTENTRYMETHOD,
C_UNALLOCATED_CALL_ISHEADER, C_UNALLOCATED_CALL_ISDATEHEADER, C_UNALLOCATED_CALL_STARTTIME);
db.execSQL(sqlToCreateUnallocatedCalls);
Log.e(TAG, "onUpgrade " + sqlToCreateUnallocatedCalls);
我想在 C_UNALLOCATED_CALL_STARTDATE 前订购,然后在 C_UNALLOCATED_CALL_RUNID 前订购。
startdate 为文本,runid 为整数。
这是我的查询:
String sql = "SELECT * FROM " + TABLEUNALLOCATED_CALL + " where " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ORDER BY "
+ LoginValidate.C_UNALLOCATED_CALL_START_DATE + " DESC , " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " ASC";
Cursor c = nfcAppObj.getDb().rawQuery(sql, null);
这是结果的屏幕截图:
如您所见,日期是有序的,但 runID 不是。它们应该是 4、12、12 或 12、12、4 而不是 12、4、12。
谢谢
[编辑 1]
我已经从数据库 return 直接检查了游标内容,在它传回 cursorLoader 之前。
String sql = "SELECT * FROM " + TABLEUNALLOCATED_CALL + " where " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ORDER BY "
+ LoginValidate.C_UNALLOCATED_CALL_START_DATE + " DESC , " + LoginValidate.C_UNALLOCATED_CALL_RUNID + " ASC";
Cursor c = nfcAppObj.getDb().rawQuery(sql, null);
if(c != null){
if(c.moveToFirst()){
do{
//String runid = c.getString(c.getColumnIndex(LoginValidate.C_UNALLOCATED_CALL_RUNID));
int runid = c.getInt(c.getColumnIndex(LoginValidate.C_UNALLOCATED_CALL_RUNID));
Log.e(TAG, "runid = " + runid);
}while(c.moveToNext());
}
结果:
2021-04-28 13:15:22.547 794-7944/com.xxx.x E/RR3ContentProvider: runid = 12
2021-04-28 13:15:22.547 6794-7944/com.xxx.x\ E/RR3ContentProvider: runid = 4
2021-04-28 13:15:22.547 6794-7944/com.xxx.x E/RR3ContentProvider: runid = 12
2021-04-28 13:15:22.547 6794-7944/com.xxx.x E/RR3ContentProvider: runid = 11
[编辑 2]
String selection = LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ";
String sort = LoginValidate.C_UNALLOCATED_CALL_START_DATE + " ASC , " + LoginValidate.C_UNALLOCATED_CALL_RUNID;
cursorLoader = new CursorLoader(this, RR3ContentProvider.CONTENT_URI_UNALLOCATEDCALLS, projection, selection, null,
sort );
LoginValidate.C_UNALLOCATED_CALL_START_DATE
列同时包含日期和时间。
如果只想按日期部分排序,请使用函数 DATE()
:
String sql = "SELECT * FROM " + TABLEUNALLOCATED_CALL + " where " +
LoginValidate.C_UNALLOCATED_CALL_RUNID + " > 0 ORDER BY DATE(" +
LoginValidate.C_UNALLOCATED_CALL_START_DATE + ") DESC, " +
LoginValidate.C_UNALLOCATED_CALL_RUNID + " ASC";