在SQL DB中维护Flex任务的相对顺序

时间:2016-03-06 21:43:40

标签: ios sql sqlite relational-database

我有一个任务调度应用程序,允许人们创建两种类型的任务......

•具有设定开始时间和持续时间的严格任务 •具有持续时间但没有特定开始时间的Flex-任务

了解Flex任务如何运作也很重要 - Flex任务将在您最近打开的时间内不断重新安排自己...例如,如果您今天的日程安排中唯一的任务是像“Go”这样的弹性任务锻炼 - 持续时间:60分钟“并且你在下午4点打开应用程序,如果你没有点击表示你完成任务的复选框并在下午5点再次打开应用程序,那么你将在下午4-5之间安排”去锻炼“,”锻炼将会被重新安排到下午5-6点,这样你想要完成的东西就会不断地在你面前,并试图适应你生活中的空白。

当用户查看他们的日程安排时,我将执行以下步骤: •获取所有严格任务的数组 •获取所有弹性任务的数组 •循环执行每个严格的任务,并确定当前循环的任务的结束时间与下一个任务的开始时间之间有多大的时间差。 •如果存在间隙,则循环执行弹性任务,并查看它们中是否有任何一个适合所讨论的时间间隔。如果flex任务足够小以适应时间间隔,则将其添加到当前循环的任务和下一个任务之间的strictTasksArray。

只要在执行弹性任务时不需要任何排序,这种方法很有效,但现在我们已经添加了用户将弹性任务拖放到特定相对顺序中的功能,如果我有任务A B C D 我拖动任务D& B到前面,以便它现在D,B,A,C需要保存该顺序,这样如果你关闭并重新打开应用程序,应用程序仍然会记得尝试适应任务D,然后是B,A& C .....但我很难想到一个有效的方法来考虑排序是相对的而不是严格的...任何想法如何在SQLIte DB中保存相对排序而不必每次都更新每个任务的DB记录用户拖放任务并更改相对排序?

2 个答案:

答案 0 :(得分:1)

如果您曾使用Basic编码,您可能记得编码代码行。建议以10为增量进行编号,这样如果以后你必须插入一两行,你就不必重新编号所有代码,只需在之前的代码之间分配一个新的数字。以及下一行。

因此,在您的情况下,我会为Rank创建一个数字字段,并为每个新的Flex任务分配Rank = max(Rank)+ 1024(例如)。之后,如果任务重新排列,我会更新一个"移动"任务的排名与其新的前一个和下一个邻居的平均等级相同。这样,任何Rank更改都只是一行的更新。因为如果Rank是int并且我在两个任务之间用完了整数,我将不得不更新所有这些,但这应该是一个后方,我只是以1024的新增量重新排名它们

答案 1 :(得分:0)

听起来你需要某种priorityorder_number列来设置任务进入的顺序。只需将它设为int,然后相应地加权。如果您需要DBMS使用查询使它们按顺序排列,则必须使用排序:

SELECT task_id, task_group_id, task_name, completed, priority 
FROM tasks WHERE user = ? and task_group_id = ? and completed = 0 ORDER BY priority ASC

你可以使用某种外键到task_group表来实际将某些任务组合在一起(如果它们是多部分的),然后构建查询以查找所有完成或不完整的任务。分配的权重仍然是正确的,因为任务不会通过ID引用彼此。

相关问题