【问题标题】:Android - easy/efficient way to maintain a "cumulative sum" for a SQLite columnAndroid - 为 SQLite 列维护“累积和”的简单/有效方法
【发布时间】:2012-03-15 15:48:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android sqlite android-contentprovider cumulative-sum


    【解决方案1】:

    可能最简单的方法是使用 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 大于当前行的行集中)并更新其 累计总和。

    如果您反对使用触发器,您可以在 insertupdate 方法中的 ContentProvider 手动,尽管因为 你几乎被 Android 上的 SQLite 锁定了,我看不出有什么理由不这样做 使用触发器。

    我假设您希望将此作为优化,否则您可以按需计算总和(O(n)O(1),因此您必须考虑 n 可能有多大,并且你多久需要一次总和)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      相关资源
      最近更新 更多