2012-03-15 34 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可能會得到,你需要多久款項)。