컨텐트 프로 바이더의 사용자 정의 사용

    주로 응용 프로그램간에 데이터를 공유하기위한 안드로이드 컨텐트 프로 네 가지 구성 요소 중 하나로서. 더 일반적인 개발 운영 체제 getContentResolver 멀티미디어 데이터베이스 (MediaProvider)의 사용이다. 이 논문은 컨텐트 프로 및주의 사항을 지정하는 방법에 대해 설명합니다.

사용자 정의 SimpleContentProvider.java는 컨텐트 프로를 물려 받았다.

다음과 같이 코드입니다 :

공공  클래스 SimpleContentProvider (가) 확장 컨텐트 프로를 {
     개인  정적  최종 문자열 TAG = "SimpleContentProvider" ; 
    
    // 사용하는 경우 일치 UriMatcher.NO_MATCH (-1)를 반환합니다 
    개인  정적  최종 UriMatcher Matcher를 = 새로운 새로운 UriMatcher (UriMatcher.NO_MATCH);
     개인  정적  최종  INT의 CODE_NOPARAM = 1;     // 인수하지                  // 코드와 일치하는 
    개인  정적  최종  INT CODE_PARAM = 2]     // 파라미터 
    
    정적 
    {         
        //com.test.providers.SimpleContentProvider / artical 형식을 준수해야 타의 추종을 불허하는 작업과 일치하는 URI를 기다리는
         // 반환하는 것은 CODE_NOPARAM, 불일치 반환 -1 일치 
        MATCHER.addURI ( "com.test.providers.SimpleContentProvider", "Artical"를 , CODE_NOPARAM는) 

        // # 숫자 com.test.providers.SimpleContentProvider / Artical / 10 나타낸다
         // CODE_PARAM, 불일치 회수 -1 일치 리턴 
        MATCHER.addURI ( "com.test.providers.SimpleContentProvider", "Artical / #"을을 , CODE_PARAM); 
        
    } 
    
    개인 dBOpenHelper dbOpenHelper;     // 데이터베이스 작업 
    민간  최종 문자열 ARTICAL_TABLE = "Artical" ;
    
    @Override 
    공공  부울 에서 onCreate () {
         //자동 생성 방법 스텁해야할 일 
        dbOpenHelper = 새로운 새로운 DBOpenHelper합니다 (는 getContext ());
         반환  ; 
    } 
    
    @Override 
    공공 열린 INSERT (열린 우리당 URI는, CV ContentValues) {
         // 해야할 일 자동 생성 방법 스텁 
        Log.i합니다 (TAG, "INSERT ( ) " ); 
        
        의 SQLiteDatabase DB = dbOpenHelper.getWritableDatabase ();
         스위치 (MATCHER.match (URI)) {
         케이스 CODE_NOPARAM :
              ID = db.insert (ARTICAL_TABLE, 널 (null) , CV);     // 기본 키 후, 증가하는 경우 기본 키 값을 반환하고, 그렇지 않으면, 행 번호
            URI = insertUri ContentUris.withAppendedId (URI, ID);
            반환 insertUri을;
        기본 :
             던져  새로운 , IllegalArgumentException를 ( "이것은 알 수없는 URI는 :"+ URI); 
        } 
    } 
    
    @Override 
    공개  INT 삭제 (URI의 URI는 스트링 선택은 문자열 []는 selectionArgs) {
         // TODO 자동 생성 방법 스텁 
        Log.i은 (는 TAG ') (삭제 " ); 
        
        DB의 SQLiteDatabase = dbOpenHelper.getWritableDatabase ();
        스위치 (MATCHER.match (URI)) {
         케이스 CODE_NOPARAM :
            반환 db.delete (ARTICAL_TABLE, 선택 selectionArgs);    // 删除所有记录
        경우 CODE_PARAM :
              식 ContentUris.parseId (URI);        // 取得열린后面的数字 
            문자열 곳 = "_id ="+ ID;
            경우 (  ! = 선택 && (selection.trim () 같음) ( "." )) { 
                여기서 + = "와"+ 선택; 
            } 
            리턴 (selectionArgs ARTICAL_TABLE) db.delete 단계;
        기본 :
             던져  새로운 (, IllegalArgumentException를 "이것은 알 수없는 URI는 다음과 같습니다" URI);
         
    } 

    @Override 
    공개  INT의 업데이트 (URI의 URI는, CV, 스트링 선택 문자열 []를 selectionArgs ContentValues) {
         // TODO 자동 생성 방법 스텁 
        Log.i (TAG "업데이트 ()" ); 
        
        DB의 SQLiteDatabase = dbOpenHelper.getWritableDatabase ();
        스위치 (MATCHER.match (URI)) {
         경우 CODE_NOPARAM :
             리턴 db.update (ARTICAL_TABLE, CV, 선택 selectionArgs);    // 更新所有记录
        경우 CODE_PARAM :
              식 ContentUris.parseId (URI);        // 取得열린后面的数字 
            문자열 곳 = "_id ="+ ID;
             IF (  = 선택 && (selection.trim ()) 등호 ( ""!. ) {) 
                WHERE + = "와"+ 선택; 
            } 
            리턴 db.update (ARTICAL_TABLE, CV는 WHERE, selectionArgs)는,
         기본 :
             던져  새로운 새 + : IllegalArgumentException가 ( "이 URI 알 수없는 것입니다" ; URI) 
        } 
    } 
    
     / ** 
     * 해당 콘텐츠 형식의 반환 
     콘텐츠 형식의 반환 세트, * com.test.android해야하는 경우 .cursor.dir의 시작 
     은 하나의 요소 인 경우 *를 com.test.android.cursor.item 시작해야 
     * / 
    @Override의 
    공개를문자열 getType로 URI (URI) {
         //TODO 자동 생성 방법 스텁 
        Log.i (TAG "getType로 ()" ); 
        
        스위치 (MATCHER.match (URI)) {
         경우 CODE_NOPARAM :
              "com.test.android.cursor.dir / artical" ;
        사례 CODE_PARAM :
             반환 "com.test.android.cursor.item / artical" ;
        기본 :
             던져  새로운 , IllegalArgumentException를 ( "이것은 알 수없는 URI는 :"+ URI); 
        } 
    } 

    @Override 
    공개 커서 쿼리 (URI의 URI 문자열 [] 투영, 스트링 선택 문자열 [] selectionArgs,
         // TODO 자동 생성 방법 스텁 
        Log.i (TAG "쿼리 ()" ); 
        
        DB의 SQLiteDatabase = dbOpenHelper.getReadableDatabase ();        
        스위치 (MATCHER.match (URI)) {
         경우 CODE_NOPARAM :
             리턴 db.query (ARTICAL_TABLE, 투영, 선택 selectionArgs,  , , 해 orderBy);
        케이스 CODE_PARAM :
              식 ContentUris.parseId (URI);        // 取得열린后面的数字 
            문자열 곳 = "_id ="+ ID;
            경우 ( 널 (null) ! = 선택 &&! (selection.trim ()). 등호 ( "")) { 
                여기서 + = "와"+ 선택; 
            } 
            리턴 db.query (ARTICAL_TABLE 투영 여기서, selectionArgs,  , , 해 orderBy);
        기본 :
             던져  새로운 , IllegalArgumentException를 ( "이것은 알 수없는 URI는 :"+ URI); 
        } 
        
    } 

}

이 클래스는, 그것은 볼 수있는 데이터베이스의 실제 동작을 기본 CRUD 방법을 제공한다. DBOpenHelper SQLiteOpenHelper 클래스가 기본 데이터베이스 생성을 포함하는 사용자 정의 클래스에서 상속되는 것을 특징으로하는, 비교적 간단한 작동과 같은 테이블을 생성, 여기에 코드를 게시하지.

특정 단계 :

1, 사용자 정의 클래스를 만들었습니다, 당신은 당신의 AndroidManifest.xml에 등록해야합니다 :

    <! - 정의 된 권한의 일부에서 다른 응용 프로그램에서 사용하기 위해 게시해야 -> 
    <권한 안드로이드 : 이름 = "android.permission.WRITE_SCP"/>
    <권한 안드로이드 : 이름 = "android.permission.READ_SCP"/>

     < 제공 안드로이드 : 이름 = "com.test.contentprovider.SimpleContentProvider" 안드로이드 : 당국 = "com.test.providers.SimpleContentProvider" 안드로이드 : 수출 "참으로"= 안드로이드 : 만약 readPermission = "android.permission.READ_SCP" 안드로이드 : 만약 writePermission = "android.permission.WRITE_SCP" > <경로 생성 권한 안드로이드 : Pathprefix를= "/ SEARCH_QUERY" 로이드 : 만약 readPermission = "android.permission.GLOBAL_SEARCH"/> </ 제공자>

설명 :

안드로이드 : = "true"를 수출은 다른 응용 프로그램에서 공급자에 액세스 할 수 있습니다; false로 설정 한 경우에만 응용 프로그램이나 서비스를 시작하거나 결합하는 동일한 사용자 ID를 사용하여 응용 프로그램의 구성 요소.
안드로이드 : 기관 인증 정보는 컨텐트 프로에서 자신을 구별
안드로이드 : 권한 권한 액세스 공급자의 문을

: 권한 정제는 다음 두 가지로 나눌 수 있습니다
안드로이드 : 읽기 권한에 대한 만약 readPermission,
안드로이드 : 만약 writePermission 쓰기 권한

권한 우선 순위보다 세분화 된 권한 후 [질문].
그러나 테스트 결과는 것을 보여 주었다 : 만 읽고 쓸 수있는 다른 응용 프로그램 제공 업체에 만약 readPermission 또는 만약 writePermission 권한을 추가 곳 역할을 수정? 인터넷 관련 프레젠테이션하지만, 찾을 수 없습니다, 누군가가 알고 있다면, 알려 메시지를 남길 수 있습니다, 감사합니다!

2, 권리의 선언, 그래서 공급자에 다른 응용 프로그램 액세스, AndroidManifest.xml을도 액세스 할 수없는 액세스를 요청해야 할 때입니다.

    <사용 - 권한 안드로이드 : 이름 = "android.permission.READ_SCP"이 /가> 
    <사용 - 권한 안드로이드 : 이름 = "android.permission.WRITE_SCP"/>

3, 프로그램 방문 :

            열린 우리당 URI = Uri.parse ( "내용 : //com.test.providers.SimpleContentProvider/artical" ); 
            컨텐트 리졸버 리졸버 = getContentResolver (); 
            ContentValues 값 = 새로운 ContentValues (); 
            values.put ( "제목", "testcase1" ); 
            values.put ( "내용", "컨텐트 프로-넣어" ); 
            resolver.insert (URI, 값);

즉 액세스의 간단한 사용자 정의 컨텐트 프로의 예 이상입니다.

4. 요약 :

    전형적으로, 컨텐트 프로 나 데이터 연산을 저장하기위한 데이터베이스가 있지만 캡슐화된다. 여부 또는 사용자 정의 클래스 기본 타입 시스템, 그것은 컨텐트 프로 + SQLiteOpenHelper를 사용하여 달성된다. (사용자 정의 클래스는 컨텐트 프로는 SQLiteOpenHelper는 해당 데이터베이스 작업을 상속 사용자 정의 클래스를 구현 상속합니다.) 예 : 시스템 MediaProvider는 SettingsProvider 또는 사용자 정의 SimpleContentProvider 위의 사실이다.

    그러나이 독립적으로 관심을 확인할 수 있습니다, 컨텐트 프로 만이 될 수 등 데이터베이스, 파일, 운영 의미하지 않는다, 그러나 나는이 테스트하지 않았습니다.

둘째, 확장 :

    일반적으로 여러 가지 방법으로 사용되는 커서 트래버스 컨텐트 프로는, 요약하면 : 사실, ()와 잠시 동안 사용합니다.

. (1) 컨텐트 리졸버 리졸버 = getContentResolver ();
 2 = resolver.query 커서 커서 (URI,  ,  ,  , )
 . (3)  IF (! = 커서  && cursor.getCount ()> 0 ) {
 . 4 ..... // 코드 위치 내지 
5  }
 . 6  
. 7  방법 :
 8.   (cursor.moveToFirst ()는이 ;! cursor.isAfterLast는 ()는, cursor.moveToNext ()) {
 9.  ...
 (10)  }
 (11).  
(12)은  2 :
 13  동안(cursor.moveToNext ()) {
 14      ... // 특정 동작 
(15)  }
 (16)  
. (17)  방식 세 :
 18이다  
. 19 ; cursor.moveToFirst ()         // 제 라인 기본적 커서 첨자 -1 
(20)은  그동안 ( ! cursor.isAfterLast ()) {
 21은      .......
 22은      ....... // 특정 동작 
(23)은      , cursor.moveToNext ()
 (24)  }
 (25)  
(26)는  27  cursor.moveToFirst ()
 28  {
 29      ......
 30 } 그동안 (cursor.moveToNext ());

코드는 매우 단순하게 보이지만, 자체 테스트의 과정에서, 그것은 이상한 질문을했다 :

    특정 이유로, 몇 가지 누락 된 데이터의 산발적 인 경우 ((사용 중) 데이터를 읽을 수있는 기록 ID가 될 수 있다면 성공적으로 삼을 읽을 수는 있지만이 시간 즉, 현재 세 개의 데이터가, 두 읽기) 동안 반복, 그래서 여기에 재현 경우를 쓸 수 없습니다 테스트 후, 될 수있는 메시지가이 알아야 할, 발견되지 감사합니다.

 

 

 

 

 

 

    

추천

출처www.cnblogs.com/sparrowlhl/p/11239530.html