查询 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
如果您知道位于完整条目和不完整条目之间的枢轴时间,您可以按枢轴时间之间的绝对距离排序。
假设您的枢轴时间存储在名为 pivotTime
的 long
变量中,查询将如下所示:
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
,有效地恢复了排序顺序。
我正在尝试查询我的 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
如果您知道位于完整条目和不完整条目之间的枢轴时间,您可以按枢轴时间之间的绝对距离排序。
假设您的枢轴时间存储在名为 pivotTime
的 long
变量中,查询将如下所示:
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
,有效地恢复了排序顺序。