查询Android内容提供商

时间:2016-03-02 12:25:05

标签: android android-sqlite android-contentprovider

我正在尝试向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");

打印出上面的数据。但是,这就是我想要实现的目标。按isCompleted顺序排序Ascending,然后按时间排序。这意味着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顺序中排序false,在DESC中排序为true。任何帮助,将不胜感激。感谢

1 个答案:

答案 0 :(得分:1)

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

解决方案1 ​​

如果您知道完整和不完整条目之间的转轴时间,则按您的转轴时间之间​​的绝对距离排序。

假设您的数据透视时间存储在名为Bu Number DeptNumber Period Date count Growth Growth percentage 1 a 1/1 null null null null 1 a 1/1 null null null null 1 b 1/1 1 null null null 的{​​{1}}变量中,查询将如下所示:

long

解释

对于pivotTime之后final Cursor cursor = getContentResolver().query(uri, null, null, null, String.format("isCompleted ASC, abs(scheduledTime - %d) ASC", pivotTime)); 的所有条目,scheduledTime表达式pivotTime将为正数,其绝对值也为正数。实际上,排序顺序与之前相同。

对于scheduleTime - pivotTime之前scheduledTime之前的条目,pivotTime表达式将变为负数。应用scheduleTime - pivotTime会将它们变为正数,从而颠倒排序顺序。

解决方案2

解决方案#2 是一种黑客攻击,但是如果不能满足您在完整或不完整条目之间找到时间的条件(或者时间可能重叠),它也可以工作。 / p>

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

abs()

解释

由于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,有效地还原了排序顺序。