查询 Android 内容提供商

Querying Android Content Provider

我正在尝试查询我的 Content Provider 以获取此数据

 scheduledTime='1457093280', user='null', isCompleted='false', id='18'
 scheduledTime='1457266080', user='null', isCompleted='false', id='19'
 scheduledTime='1457352540', user='null', isCompleted='false', id='20'
 scheduledTime='1459155180', user='null', isCompleted='false', id='6'
 scheduledTime='1456391940', user='null', isCompleted='true', id='2'
 scheduledTime='1456394140', user='null', isCompleted='true', id='1'
 scheduledTime='1456395600', user='null', isCompleted='true', id='3'
 scheduledTime='1456395600', user='null', isCompleted='true', id='4'
 scheduledTime='1456399260', user='null', isCompleted='true', id='5'
 scheduledTime='1456918140', user='null', isCompleted='true', id='14'
 scheduledTime='1456918320', user='null', isCompleted='true', id='15'
 scheduledTime='1456920360', user='null', isCompleted='true', id='16'
 scheduledTime='1456921020', user='null', isCompleted='true', id='21'

这就是我查询它的方式。

 final Cursor cursor = getContentResolver().query(uri, null, null, null, "isCompleted ASC, scheduledTime ASC");

打印出上面的数据。但是,这就是我想要实现的目标。按 Ascending 顺序对 isCompleted 排序,然后按时间排序。这意味着 false Completed 将按最接近重发时间的那个排序,而 true completed 也会按最接近重发时间的那个排序。更像是,18, 19, 20, 21, 16, 15, 14, 5, 4, 3, 1, 2 18, 19, 20 看起来排序很好,但是 21, 16, 15, 14, 5, 4, 3, 1, 2。更像是,按 ASC 顺序排序为假,按 DESC 顺序为真。任何帮助,将不胜感激。谢谢

我看到两个可能的解决方案。

解决方案 1

如果您知道位于完整条目和不完整条目之间的枢轴时间,您可以按枢轴时间之间​​的绝对距离排序。

假设您的枢轴时间存储在名为 pivotTimelong 变量中,查询将如下所示:

final Cursor cursor = getContentResolver().query(uri, null, null, null,
    String.format("isCompleted ASC, abs(scheduledTime - %d) ASC", pivotTime));

说明

对于在 pivotTime 之后带有 scheduledTime 的所有条目,表达式 scheduleTime - pivotTime 将为正数并且其绝对值也将为正数。实际上,排序顺序与以前相同。

对于在 pivotTime 之前带有 scheduledTime 的条目,表达式 scheduleTime - pivotTime 将变为负数。应用 abs() 会将它们变成正数,颠倒排序顺序。

解决方案 2

解决方案 #2 有点像 hack,但如果不满足您可以在完整或不完整条目之间找到时间的条件(或者如果时间可能重叠)。

在这种情况下,以下查询应该有效。

final Cursor cursor = getContentResolver().query(uri, null, null, null,
    "isCompleted ASC, ((isCompleted == 'false') - 0.5) * scheduledTime ASC");

说明

由于 isCompleted == 'false' 被评估为 1 对于不完整的条目,表达式 (isCompleted == 'false') - 0.5 导致 0.5。因此,不完整的条目将按 0.5 * scheduledTime 排序,这等于原始排序。

对于已完成的条目,isCompleted == 'false' 的计算结果为 0,而 (isCompleted == 'false') - 0.5 的结果为 -0.5,有效地恢复了排序顺序。