폰에 입력된 일정 db 를 맘대로 요리하기가 쉽지 않습니다.
db 를 열어봐도 아주 많은 테이블이 있지만 어떻게 할 지 막연합니다.
원하는 내용을 뽑기 위한 기본적인 설명을 간략하게 적어 봅니다.
dbcal=/data/data/com.android.providers.calendar/databases/calendar.db
안드로이드 일정 db 위지 입니다.
안드로이드 비지박스의 날짜 명령은 타임존(시차)를 감안하지 못합니다.
그래서 toolbox 에서 날짜를 뽑습니다.
date=$( toolbox date "+%Y-%m-%d" )
date 변수에 2014-12-26 이렇게 저장됩니다.
특정 날짜를 변수로 지정해서 진행할 수도 있습니다.
sqlite3 $dbcal "SELECT Instances.begin,Events.title,Calendars.Name FROM Instances, Events, Calendars WHERE Instances.event_id = Events._id AND date(datetime(begin / 1000 , 'unixepoch')) = '$date' AND Events.Calendar_id = Calendars._id ORDER BY Instances.begin ASC;" | grep -i -e "legalholiday" -e "legalsubstholiday" | awk -F "|" '{printf strftime("%y-%m-%d %a",($1/1000+32400))}{print " :",$2}'
대단히 복잡해 보입니다만 하나하나 끊어서 설명을 적습니다.
안드로이드 캘린더 일정 db 에서 주목할 테이블은 3개 입니다.
Instances, Events, Calendars
이벤트에는 그 행사의 내용이 있고, 캘린더에는 여러가지 분류된 캘린더가 있습니다. 구글캘린더와 폰에 있는 로컬 캘린더등등이 있겠지요.
이 데이터들을 통합해서 날짜, 타임을 정렬한게 Instances 에 있습니다.
하나 예를 들어서 홍길동 생일을 연락처에 입력한 경우에 이벤트에는 홍길동 생일이 캘린더 로컬 생일에 입력되고 반복 만큼의 날짜 epoch 값이 Instances 에 기록됩니다.
SELECT Instances.begin,Events.title,Calendars.Name FROM Instances, Events, Calendars
요 구문은 Instances 에서 시작시각, 이벤트 타이틀, 캘린더의 이름이 파이프(|) 로 나눠져서 출력됩니다.
WHERE Instances.event_id = Events._id AND date(datetime(begin / 1000 , 'unixepoch')) = '$date' AND Events.Calendar_id = Calendars._id
이 구문만 이해하면 되는데 Instances 의 이벤트 아이디와 Events의 아이디 값을 연결하고 (Instances.event_id = Events._id ) 이벤트의 캘린더를 캘린더 종류에 연결 (Events.Calendar_id = Calendars._id)하면 끝입니다.
각각의 일정의 상호 연관관계만 잡아주면 해결되는 것이지요.
원하는 일정의 시각을 조건으로 뽑는 코드는
date(datetime(begin / 1000 , 'unixepoch')) = '$date'
입니다.
Instances.begin 데이터는 미리세컨드로 기록됩니다.
그래서 나누기 1000 하고 그 epoch 값을 date로 뽑으면 2014-12-26 이렇게 나오는데 그게 $date 변수와 같은 것만 뽑으면 원하는 날짜의 이벤트만 출력할 수 있게 되는 겁니다.
어렵지요?
기본 지식없이 저도 이거 이해하는데 코피 좀 흘렸습니다. ㅠ.ㅠ
특정일의 데이터를 출력하면
일정 시작시각, 제목, 캘린더 가 출력될텐데 여기서 본인이 원하는 것만 뽑으면 되는 겁니다.
응용해봅니다.
grep -i -e "legalholiday" -e "legalsubstholiday"
이 코드는 해당 날짜의 이벤트 중에서 공휴일 혹은 대체 공휴일의 이벤트만 뽑게 하는거지요.
그 날이 공휴일인지 아닌지 판단할 수 있는 방법이 되는 겁니다. ^^*
물론 데이터를 뽑는 단계에서 sqlite3 WHERE 에 AND 로 조건을 더 넣으서 해결할 수도 있을거구요.
** 적어놓고도 뭔 소린지 ㅋ