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

Posted

技术标签:

【中文标题】如何按日期时间和整数对光标进行排序【英文标题】:How can order the cursor by datetime and Integer 【发布时间】:2021-07-21 19:19:58 【问题描述】:

我正在尝试先按日期时间排序结果光标,然后按整数 ID。

如果我单独按 DateTime 排序,它可以正常工作,如果我单独按 Integer ID 排序,它也可以正常工作。

到目前为止我已经尝试过:我尝试将 ASC 附加到整数 ID 排序。 (我知道这是默认设置,但值得一试)。

谁能解释为什么 SQL 不能按我的意愿排序?

这是我的表创建:

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 是 TEXT,runid 是 Integer。

这是我的查询:

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]

我在游标从数据库返回后和传回游标加载器之前直接检查了游标内容。

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

【问题讨论】:

C_UNALLOCATED_CALL_START_DATE中的日期格式是什么?在显示结果之前,是否检查了 rawQuery() 返回的游标对象是否正确排序了行? @forpas 是的,我已经直接从数据库中检查了游标的结果。我已经在上面发布了 EDIT1 @forpas 日期格式为 2021-04-30T17:00:00 您的日期格式很好,sql select 语句似乎正确。下一步是从设备中提取数据库并检查它。检查表定义是否完全符合预期,以及 2 列的值。我无法重现您的问题。你能用小提琴中的样本数据重现它吗:dbfiddle.uk/?rdbms=sqlite_3.27?还要仔细检查您使用的所有 C_xxxxxx 常量。 @forpas :) 非常感谢,现在可以使用了。我已经坚持了一周,认为这是 sql 引擎问题,或者可能与 CursorLoader 或 contentProvider 相关联。你能把你的 cooment 放在答案中,我会在有资格时接受。再次谢谢你 【参考方案1】:

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

【讨论】:

抱歉忘记了这一切:)

以上是关于如何按日期时间和整数对光标进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按日期降序对数据表进行排序

如何按日期和时间对 jsonarray 数据进行排序并放入列表视图适配器

如何在 MongoDB 中按日期对集合进行排序?

如何在飞镖/颤振中按日期对列表进行排序/排序?

如何按日期对 DataTable 列进行排序

如何按修改日期对 CloudKit 结果进行排序?