如何按日期时间和整数对游标进行排序

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