짱구삼촌
14.12.26
조회 수 5381
추천 수 2
댓글 0
폰에 입력된 일정 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 로 조건을 더 넣으서 해결할 수도 있을거구요.

** 적어놓고도 뭔 소린지 ㅋ

짱구삼촌 님의 SIGNATURE

profile

그래도 아직은 사랑이, 낡은 외투처럼 너덜너덜해져서 이제는 갖다 버려야 할, 그러나 버리지 못하고...

"신은 그저 질문하는 자일 뿐... 운명은 내가 던지는 질문이다. 답은 그대들이 찾아라."

댓글 0
댓글 쓰기 권한이 없습니다.
정렬 목록 검색 쓰기
등록된 글이 없습니다.
1 - 2