2012-03-15 32 views
0

维护SQLite中特定数据列的“累计总和”的最佳方法是什么?我在网上找到了几个例子,但我不能100%确定如何将这些方法整合到我的ContentProvider中。Android - 简单/高效的方式来维护SQLite列的“累计总和”

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

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

然而,这是很不理想和处理与许多列的表时,变得非常混乱。有没有办法以某种方式自动化每次我插入/更新记录在我的表中更新累积数据的过程?我怎样才能将其整合到我的ContentProvider实施中?

我知道必须有办法做到这一点......我只是不知道如何。谢谢!

回答

3

可能最简单的方法是使用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 )和更新其累积金额 。

如果你是反对使用触发器,你可以做更多或更少的 同样的事情在ContentProvider的手动insertupdate方法,但因为 你几乎锁定SQLite的Android上,我不t看到很多理由不要 使用触发器。

我假设你是想做到这一点作为一个优化,否则你可能只是计算需求(O(n)总和VS O(1),所以你必须要考虑有多大n可能会得到,你需要多久款项)。