2012-03-15 3 views
0

SQLite의 특정 데이터 열의 "누적 합계"를 유지하는 가장 좋은 방법은 무엇입니까? 온라인에서 여러 가지 예를 발견했지만,이 접근법을 내 ContentProvider에 통합하는 방법을 100 % 확신하지는 못했습니다.안드로이드 - 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 을 선택하여). 누적 합계 인 을 업데이트합니다. 당신이 트리거를 사용에 반대하는 경우

, 당신은 할 수있는 더 많거나 적은 에서 같은 일 이후 거의 안드로이드에 SQLite는에 고정하고 있지만 수동으로 insertupdate 방법의 컨텐트 프로, 내가 돈 ' 트리거를 사용하지 않는 많은 이유가 있습니다.

는 당신이 그렇지 않으면 당신은 단지 O(1) 대 수요 (O(n)의 합계를 계산 수 있기 때문에, 최적화로이 작업을 수행하고자하는 가정, 그래서 당신은 얻을 수 있습니다 얼마나 큰 n 고려해야 할 것, 그리고 얼마나 자주 당신은 필요 합계).

관련 문제