이전 학습: 콘텐츠 제공자

캘린더 제공자 (Calendar Provider)

1. 개요

2. 캘린더 제공자의 접근 권한

3. 캘린더 테이블

상수 설명
NAME 캘린더 이름입니다.
CALENDAR_DISPLAY_NAME 사용자에게 표시되는 이 캘린더의 이름입니다.
VISIBLE 캘린더를 표시하기로 선택했는지를 나타내는 부울입니다. 값이 0인 경우 이 캘린더와 관련된 이벤트를 표시하면 안 된다는 뜻입니다. 값이 1인 경우 이 캘린더와 관련된 이벤트를 표시해야 한다는 뜻입니다. 이 값은 CalendarContract.Instances 테이블의 행을 생성하는 데 영향을 미칩니다.
SYNC_EVENTS 캘린더를 동기화하고 이 캘린더의 이벤트를 기기에 저장해야 할지를 나타내는 부울입니다. 값이 0인 경우 이 캘린더를 동기화하거나 이에 속한 이벤트를 기기에 저장하면 안 된다는 뜻입니다. 값이 1인 경우 이 캘린더에 대한 이벤트를 동기화하고 이에 속한 이벤트를 기기에 저장하라는 뜻입니다.

3.1 캘린더 쿼리

4. 이벤트 테이블

상수 설명
CALENDAR_ID 이벤트가 속한 캘린더의 _ID입니다.
ORGANIZER 이벤트 조직자(소유자)의 이메일입니다.
TITLE 이벤트 제목입니다.
EVENT_LOCATION 이벤트가 일어나는 장소입니다.
DESCRIPTION 이벤트 설명입니다.
DTSTART 이벤트가 시작되는 시간을 Epoch 이후 UTC 밀리초 단위로 나타낸 것입니다.
DTEND 이벤트가 종료되는 시간을 Epoch 이후 UTC 밀리초 단위로 나타낸 것입니다.
EVENT_TIMEZONE 이벤트의 표준 시간대입니다.

4.1 CALENDAR_ID로 이벤트 조회

4.2 이벤트 추가

4.3 이벤트 수정

4.3.1 방식1 코드

    private void updateEvent() {
        // 권한 검사 및 요청
        if (ActivityCompat.checkSelfPermission(EventActivity.this, Manifest.permission.WRITE_CALENDAR)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    EventActivity.this,
                    new String[]{Manifest.permission.WRITE_CALENDAR},
                    REQUEST_CODE_UPDATE_EVENT);
            return;
        }

        // 화면상의 EditText 객체에  입력된 값을 읽어옴
        String idString = ((EditText) findViewById(R.id._id)).getText().toString();
        String title = ((EditText) findViewById(R.id.edit_title)).getText().toString();
        String dtstart = ((EditText) findViewById(R.id.edit_dtstart)).getText().toString();
        String dtend = ((EditText) findViewById(R.id.edit_dtend)).getText().toString();

        ContentResolver cr = getContentResolver();
        
        //  수정할 항목과 값을 ContentValues 객체에 설정
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.TITLE, title);
        values.put(CalendarContract.Events.DTSTART, convertDateToTime(dtstart));
        values.put(CalendarContract.Events.DTEND, convertDateToTime(dtend));

        // Events 테이블 URI 마지막 부분에 id를 덧붙여 새로운 URI를 얻음
        Uri updateUri  = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, Long.parseLong(idString));
        
        // 
        int rows = cr.update(updateUri, values, null, null);
   }

4.3.2 방식2 코드

    private void updateEvent() {
        // 권한 검사 및 요청
        if (ActivityCompat.checkSelfPermission(EventActivity.this, Manifest.permission.WRITE_CALENDAR)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    EventActivity.this,
                    new String[]{Manifest.permission.WRITE_CALENDAR},
                    REQUEST_CODE_UPDATE_EVENT);
            return;
        }

        // 화면상의 EditText 객체에  입력된 값을 읽어옴
        String idString = ((EditText) findViewById(R.id._id)).getText().toString();
        String title = ((EditText) findViewById(R.id.edit_title)).getText().toString();
        String dtstart = ((EditText) findViewById(R.id.edit_dtstart)).getText().toString();
        String dtend = ((EditText) findViewById(R.id.edit_dtend)).getText().toString();

        ContentResolver cr = getContentResolver();
        
        //  수정할 항목과 값을 ContentValues 객체에 설정
        ContentValues values = new ContentValues();
        values.put(CalendarContract.Events.TITLE, title);
        values.put(CalendarContract.Events.DTSTART, convertDateToTime(dtstart));
        values.put(CalendarContract.Events.DTEND, convertDateToTime(dtend));

    // 수정할 이벤트 레코드를 선택하기 위해서 where 문자열과 selectionArgs 문자열 배열 설정
        String where = "(" + CalendarContract.Events._ID + " = ?) ";
        String[] selectionArgs = new String[]{idString};
        int rows = cr.update(CalendarContract.Events.CONTENT_URI, values, where, selectionArgs);
   }

4.4 이벤트 삭제

5. 기타 다른 테이블

6. 캘린더 인텐트

작업 URI 설명
VIEW content://com.android.calendar/time/<ms_since_epoch> 캘린더를 <ms_since_epoch>에서 지정한 시간으로 엽니다.
View content://com.android.calendar/events/<event_id> <event_id>에서 지정한 이벤트를 봅니다.
EDIT content://com.android.calendar/events/<event_id> <event_id>에서 지정한 이벤트를 편집합니다.
INSERT content://com.android.calendar/events 이벤트를 생성합니다.

6.1 인텐트를 사용하여 이벤트 삽입

6.2 인텐트를 사용하여 이벤트 편집

6.3 인텐트를 사용하여 캘린더 데이터 보기