2012-03-15 5 views
0

SQLiteの特定のデータカラムの "累積合計"を維持する最良の方法は何ですか?私はいくつかの例をオンラインで見つけましたが、私はこれらのアプローチをどのように私のContentProviderに統合するかを100%確信していません。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トリガです。それは私が知っている最も近い "自動化"の です。以前の の累積合計を取る挿入トリガーを持つだけで、現在のスコアが加算され、新しい行の累積値である 合計に格納されます。トリガーとオリジナルのインサートが同じ トランザクションであることを確認すること

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 

:このような何かが(_idと仮定するとあなたが発注されている列です)。 score列を任意に更新するには、 に次の最高のIDを何らかの形で再帰的なトリガーを実装する必要があります(現在のIDよりも大きなIDを持つ行セットの最小ID を選択することによって)累積合計を に更新します。

あなたはトリガを使用に反対している場合は、手動insertupdate方法で のContentProviderに多かれ少なかれ同じことを行うことができ、 ので、あなたはかなりのAndroid上でのSQLiteにロックされているのに、私は「ドン トリガーを使用していない多くの理由を参照してください。

は、私はあなたがそうでなければ、あなただけのO(1)対オンデマンド(O(n)の合計を計算可能性があるので、最適化としてこれをやりたいと思っていると仮定し、あなたが得る可能性がありますどのように大きなnを検討する必要があるだろう、とどのくらいの頻度で必要合計)。

関連する問題