0

在 SQLite 中维护特定数据列的“累积和”的最佳方法是什么?我在网上找到了几个示例,但我不能 100% 确定如何将这些方法集成到我的ContentProvider.

在以前的应用程序中,我尝试自己维护累积数据,每次向表中插入新数据时都会更新数据。例如,在下面的示例代码中,每次我添加一个带有 value 的新记录时score,我都会cumulative_score根据其在前一行中的值手动更新 的值。

_id   score   cumulative_score
1     100     100
2     50      150
3     25      175
4     25      200
5     10      210

但是,这远非理想,并且在处理具有许多列的表时变得非常混乱。每次我在表中插入/更新记录时,有没有办法以某种方式自动更新累积数据的过程?我如何将其集成到我的ContentProvider实现中?

我知道一定有办法做到这一点......我只是不知道怎么做。谢谢!

4

1 回答 1

4

可能最简单的方法是使用 SQLite 触发器。这是我所知道的最接近“自动化”的地方。只需有一个插入触发器,它采用先前的累积总和,将当前分数相加并将其存储在新行的累积总和中。像这样的东西(假设_id是您要订购的列):

CREATE TRIGGER calc_cumulative_score AFTER INSERT ON tablename FOR EACH ROW
BEGIN
    UPDATE tablename SET cumulative_score =
        (SELECT cumulative_score
         FROM tablename
         WHERE _id = (SELECT MAX(_id) FROM tablename))
        + new.score
    WHERE _id = new._id;
END

确保触发器和原始插入在同一个事务中。对于score列的任意更新,您必须实现一个递归触发器,以某种方式找到下一个最高 id(可能通过在 id 大于当前行的集合中选择最小 id)并更新其累积和。

insert如果您反对使用触发器,您可以在 ContentProvider 的and方法中手动执行或多或少相同的update操作,但由于您在 Android 上几乎被锁定在 SQLite 中,我认为没有太多理由不使用触发器.

我假设您希望将此作为优化,否则您可以按需计算总和(O(n)vs O(1),因此您必须考虑n可能会得到多大,以及您需要总和的频率)。

于 2012-04-15T00:31:23.543 回答