ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ContentProvider 사용하기 위한 밑밥 1. UriMatcher 란 무엇일까?
    IT&개발/안드로이드2 2015. 8. 23. 17:41
    728x90
    반응형

    http://developer.android.com/reference/android/content/UriMatcher.html#NO_MATCH

    <안드로이드 디벨러퍼 사이트>


    UriMatcher란 무엇일까? 라는 질문이 언제 생각날까? 바로 사용할 때이다. 


    그렇다면 언제 사용할까? 필자의 경우에는 ContentProvider를 마주하는 순간 이것이 무엇에 쓰는지 궁금했다.


    왜냐하면 그렇지 아니하고는 ContentProvider 예제를 보아도 이해가 가지 않았기 때문이다.


    그렇다면 본론으로 UriMatcher란 무엇인가? 

    이름에서도 유추가 가능하다시피 두개의 Uri값을 비교하여 해당하는 값(약속된 값을)을 출력해주는 기능을 하는 class이다.


    UriMatcher는 2개의 메소드만을 가진다. 

    1. 바로 약속된 값을 등록할 때 사용하는 addURI()

    2. 새로운 URI를 가져와서 등록된 URI와 비교하여 해당하는 정수값을 반환해주는 match()이다.




    URI 크게 authority 와 path로 구성되어 있다.


    1. 컨텐트 프로바이더에 의해 제공되는 데이터임을 알립니다. 이 부분은 변하지 않습니다.
    2. 컨텐트 프로바이더의 authority부분입니다. 각 컨텐트 프로바이더의 고유 이름입니다.
    3. 컨텐트 프로바이더의 Path 부분이며, 어떤 데이터를 반환할지를 이 부분을 통해 지정합니다. 
    4. 3번 부분의 Path 하위의 데이터 중 하나를 가리키는 것으로, 해당 데이터의 ID를 나타냅니다.


    1) addURI

    addURI 를 사용할 때 인자는  3개가 있다.

    authority : 컨텐트 프로바이더 중에서 어느 authority는 해당하는지 구분을 할 때 사용 지정된 값이 있다. 

    path : authority 중에서 다음 path에 해당하며 path/# 으로 하는 경우 path 다음에 모든 숫자를 지칭하며

           path/* 의 경우 숫자와 문자를 포함한다.

    code  : match() 메소드 사용시 일치한다면 반환하는 정수를 의미한다.


    사용 예 )

    private static final int PEOPLE = 1;
       
    private static final int PEOPLE_ID = 2;
       
    private static final int PEOPLE_PHONES = 3;
       
    private static final int PEOPLE_PHONES_ID = 4;
       
    private static final int PEOPLE_CONTACTMETHODS = 7;
       
    private static final int PEOPLE_CONTACTMETHODS_ID = 8;

       
    private static final int DELETED_PEOPLE = 20;

       
    private static final int PHONES = 9;
       
    private static final int PHONES_ID = 10;
       
    private static final int PHONES_FILTER = 14;

       
    private static final int CONTACTMETHODS = 18;
       
    private static final int CONTACTMETHODS_ID = 19;

       
    private static final int CALLS = 11;
       
    private static final int CALLS_ID = 12;
       
    private static final int CALLS_FILTER = 15;

       
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

       
    static
       
    {
            sURIMatcher
    .addURI("contacts", "people", PEOPLE);
            sURIMatcher
    .addURI("contacts", "people/#", PEOPLE_ID);
            sURIMatcher
    .addURI("contacts", "people/#/phones", PEOPLE_PHONES);
            sURIMatcher
    .addURI("contacts", "people/#/phones/#", PEOPLE_PHONES_ID);
            sURIMatcher
    .addURI("contacts", "people/#/contact_methods", PEOPLE_CONTACTMETHODS);
            sURIMatcher
    .addURI("contacts", "people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
            sURIMatcher
    .addURI("contacts", "deleted_people", DELETED_PEOPLE);
            sURIMatcher
    .addURI("contacts", "phones", PHONES);
            sURIMatcher
    .addURI("contacts", "phones/filter/*", PHONES_FILTER);
            sURIMatcher
    .addURI("contacts", "phones/#", PHONES_ID);
            sURIMatcher
    .addURI("contacts", "contact_methods", CONTACTMETHODS);
            sURIMatcher
    .addURI("contacts", "contact_methods/#", CONTACTMETHODS_ID);
            sURIMatcher
    .addURI("call_log", "calls", CALLS);
            sURIMatcher
    .addURI("call_log", "calls/filter/*", CALLS_FILTER);
            sURIMatcher
    .addURI("call_log", "calls/#", CALLS_ID);
       
    }


    2) match


    addURI로 등록된 URI들과 새로운 URI를 비교하여 return 값을 받는다.


    인자로는 uri 하나를 가진다.


    사용예)


    보통 switch문을 활용하여 사용한다.

    public String getType(Uri url)
       
    {
           
    int match = sURIMatcher.match(url);
           
    switch (match)
           
    {
               
    case PEOPLE:
                   
    return "vnd.android.cursor.dir/person";
               
    case PEOPLE_ID:
                   
    return "vnd.android.cursor.item/person";
    ... snip ...
                   
    return "vnd.android.cursor.dir/snail-mail";
               
    case PEOPLE_ADDRESS_ID:
                   
    return "vnd.android.cursor.item/snail-mail";
               
    default:
                   
    return null;
           
    }
       
    }



    Content Provider 사용을 위한 기본지식 1. UriMatcher 사용법


    반응형

    댓글

Designed by Tistory.