在 SQL 数据库中维护 Flex 任务的相对顺序
Maintaining a Relative Order of Flex Tasks in a SQL DB
我有一个任务安排应用程序,允许人们创建 2 种类型的任务...
•严格 - 具有设定开始时间和持续时间的任务
•灵活- 有持续时间但没有特定开始时间的任务
了解弹性任务的运作方式也很重要 - 弹性任务将在您开放的最近时间全天不断地重新安排自己...例如,如果您今天日程表上的唯一任务是弹性任务,例如"Go workout - duration:60mins" 并且您在下午 4 点打开应用程序,它会为您安排 "Go workout" 下午 4-5 点,如果您不单击表示您已完成任务的复选框并在下午 5 点再次打开应用程序“去锻炼将重新安排到下午 5 点到 6 点,这样你想完成的事情就会不断地出现在你的面前,并试图融入你生活的空白。
当用户在此处查看他们的日程安排时,我会执行以下步骤:
•抓取所有严格任务的数组
•抓取所有弹性任务的数组
• 遍历每个严格的任务,找出当前正在循环的任务的结束时间和下一个任务的开始时间之间的时间间隔有多大。
•if a gap exists 循环遍历弹性任务,看看是否有任何任务适合所讨论的时间间隔。如果 flex 任务足够小以适应时间间隔,则将其添加到当前正在循环的任务和下一个任务之间的 strictTasksArray。
只要在弹性任务方面不需要任何排序,这就很好用,但现在我们已经添加了用户将弹性任务拖放到特定相对顺序的功能,也就是如果我有任务 A,B,C,D
然后我将任务 D 和 B 拖到前面,这样它现在是 D、B、A、C,它需要保存该顺序,这样如果您关闭并重新打开该应用程序,该应用程序仍会记得尝试将任务 D 放入,然后由 B、A 和 C .....但考虑到顺序是相对的而不是严格的,我在想一个有效的方法时遇到了很大的麻烦……任何关于如何在 SQLIte 数据库中保存相对顺序而不必更新每个的想法任务的数据库记录每次用户 drag/drops 一项任务并更改相对顺序?
听起来您需要某种 priority
或 order_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 table 来实际将某些任务组合在一起,如果它们是多部分的,然后构建一个查询来找到所有的任务完整或不完整。分配的权重仍然是正确的,因为任务不通过 ID 相互引用。
如果您曾经用 Basic 编写过代码,您可能还记得对代码行进行编号。建议以 10 为增量进行编号,这样如果稍后您必须插入一两行代码,您就不必对所有代码重新编号,只需在前一个代码和下一个代码之间分配一个新编号即可下一行。
因此,在您的情况下,我会为 Rank 创建一个数字字段,并为每个新的 Flex 任务分配 Rank = max(Rank) + 1024(例如)。之后,如果任务被重新安排,我将只更新一个 "moved" 任务的排名,它是新的前一个和下一个邻居的平均排名。这样,任何 Rank 更改都只会更新一行。当然,如果 Rank 是 int
而我 运行 是两个任务之间的整数,我将不得不更新它们,但这应该是一个后置事件,我会重新对它们进行排名新增量 1024.
我有一个任务安排应用程序,允许人们创建 2 种类型的任务...
•严格 - 具有设定开始时间和持续时间的任务 •灵活- 有持续时间但没有特定开始时间的任务
了解弹性任务的运作方式也很重要 - 弹性任务将在您开放的最近时间全天不断地重新安排自己...例如,如果您今天日程表上的唯一任务是弹性任务,例如"Go workout - duration:60mins" 并且您在下午 4 点打开应用程序,它会为您安排 "Go workout" 下午 4-5 点,如果您不单击表示您已完成任务的复选框并在下午 5 点再次打开应用程序“去锻炼将重新安排到下午 5 点到 6 点,这样你想完成的事情就会不断地出现在你的面前,并试图融入你生活的空白。
当用户在此处查看他们的日程安排时,我会执行以下步骤: •抓取所有严格任务的数组 •抓取所有弹性任务的数组 • 遍历每个严格的任务,找出当前正在循环的任务的结束时间和下一个任务的开始时间之间的时间间隔有多大。 •if a gap exists 循环遍历弹性任务,看看是否有任何任务适合所讨论的时间间隔。如果 flex 任务足够小以适应时间间隔,则将其添加到当前正在循环的任务和下一个任务之间的 strictTasksArray。
只要在弹性任务方面不需要任何排序,这就很好用,但现在我们已经添加了用户将弹性任务拖放到特定相对顺序的功能,也就是如果我有任务 A,B,C,D 然后我将任务 D 和 B 拖到前面,这样它现在是 D、B、A、C,它需要保存该顺序,这样如果您关闭并重新打开该应用程序,该应用程序仍会记得尝试将任务 D 放入,然后由 B、A 和 C .....但考虑到顺序是相对的而不是严格的,我在想一个有效的方法时遇到了很大的麻烦……任何关于如何在 SQLIte 数据库中保存相对顺序而不必更新每个的想法任务的数据库记录每次用户 drag/drops 一项任务并更改相对顺序?
听起来您需要某种 priority
或 order_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 table 来实际将某些任务组合在一起,如果它们是多部分的,然后构建一个查询来找到所有的任务完整或不完整。分配的权重仍然是正确的,因为任务不通过 ID 相互引用。
如果您曾经用 Basic 编写过代码,您可能还记得对代码行进行编号。建议以 10 为增量进行编号,这样如果稍后您必须插入一两行代码,您就不必对所有代码重新编号,只需在前一个代码和下一个代码之间分配一个新编号即可下一行。
因此,在您的情况下,我会为 Rank 创建一个数字字段,并为每个新的 Flex 任务分配 Rank = max(Rank) + 1024(例如)。之后,如果任务被重新安排,我将只更新一个 "moved" 任务的排名,它是新的前一个和下一个邻居的平均排名。这样,任何 Rank 更改都只会更新一行。当然,如果 Rank 是 int
而我 运行 是两个任务之间的整数,我将不得不更新它们,但这应该是一个后置事件,我会重新对它们进行排名新增量 1024.