2016-02-14 51 views
-2

我有一个SQLite表任务,我想在ListView中显示具有最高“优先级”的5个任务。改变SQLite游标?

优先级是一个复杂的计算,所以我不能只是在SQL中计算它,并命令/限制结果。为了实现这个目标,我想要获得一个Cursor的所有任务,通过行来计算和设置一个“优先级”数字,并删除/重新排列光标的行,以便它只显示第一个5.

从我发现,我可以通过扩展Cursor设置一个“优先级”值的行,以便它暴露CursorWindow。

不幸的是,我还没有找到一种方法来改变光标的行来删除/排序它们。

有没有办法做到这一点?如果没有,我也开放给其他高效的设计替代品。

当然,我可以在表格中添加一个“优先级”列,每次更新它,然后按顺序/限制进行选择,但这不是非常有效。

我想我也可以在适配器中进行过滤/排序,但我不认为这是适配器应该做的那种工作。

+0

使用'android.database.CursorWrapper'和覆盖'moveToPosition'和'getCount'方法 – pskink

+0

如何计算优先级? –

+0

难道你不能创建一个SQL'View',你会在哪里找到计算的优先级? –

回答

0

在Android中,不容易安装用户定义的函数,因此如果在SQL中无法计算优先级,则必须手动执行排序/过滤。

您从数据库中获得的游标(类SQLiteCursor)是只读的,因此您不能将优先级存储在游标本身中。

您必须添加间接的层次:创建自己的类存储优先级,并到原光标所在行的引用:

class TaskPriority { 
    public int priority; 
    public int positionInCursor; 
}; 

计算这些领域对游标中的所有行,然后进行排序,这些对象优先。然后,您可以使用前五个positionInCursor字段来获取实际数据。

(如果你需要一些Cursor来显示数据在列表视图,只需将五行复制到MatrixCursor

+0

不需要使用'MatrixCursor'进行数据重复:你在答案中提到的所有内容都可以在'CursorWrapper'中完成(我知道5行不是什么大问题,但仍然...) – pskink

+0

@pskink然后写一个回答显示它是如何完成的。 –

+0

它的做法与你在答案中提出的方式相同:唯一的区别是'Cursor'的数据访问 – pskink