Android 애플리케이션 개발 기반 9: 컨텐츠 공급자

6410 단어

콘텐츠 공급자

  • 응용된 데이터베이스는 다른 응용의 접근을 허용하지 않는다
  • 내용 제공자의 역할은 다른 응용 프로그램이 당신의 데이터베이스에 접근하도록 하는 것이다
  • 사용자 정의 콘텐츠 공급자,Content Provider 클래스를 계승하여 삭제 수정 방법을 다시 쓰고 방법에서 삭제 수정 데이터베이스 코드를 쓴다. 예를 들어 증가 방법
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        db.insert("person", null, values);
        return uri;
    }
    
  • 명세서 파일에 내용 제공자의 라벨을 정의할 때 authorities 속성이 있어야 합니다. 이것은 내용 제공자의 호스트 이름이고 기능이 유사한 주소
    <provider android:name="com.itheima.contentprovider.PersonProvider"
        android:authorities="com.itheima.person"
        android:exported="true"
     ></provider>
    
  • 다른 응용 프로그램을 만들고 사용자 정의 내용 공급자에 접근하여 데이터베이스에 대한 삽입 작업을 실현한다
    public void click(View v){
        //         
        ContentResolver cr = getContentResolver();
        ContentValues cv = new ContentValues();
        cv.put("name", "  ");
        cv.put("phone", 138856);
        cv.put("money", 3000);
        //url:         
        cr.insert(Uri.parse("content://com.itheima.person"), cv);
    }
    
  • UriMatcher

  • 한 개의uri가 지정한 여러 개의uri 중 어느 개와 일치하는지 판단하는 데 사용
  • 일치 규칙 추가
    //    uri
    um.addURI("com.itheima.person", "person", PERSON_CODE);
    um.addURI("com.itheima.person", "company", COMPANY_CODE);
    //#         
    um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
    
  • Uri 매칭기를 통해 서로 다른 테이블을 조작할 수 있음
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        if(um.match(uri) == PERSON_CODE){
            db.insert("person", null, values);
        }
        else if(um.match(uri) == COMPANY_CODE){
            db.insert("company", null, values);
        }
        else{
            throw new IllegalArgumentException();
        }
        return uri;
    }
    
  • 경로에 숫자가 있으면 추출한api
    int id = (int) ContentUris.parseId(uri);
    
  • 문자 데이터베이스

  • sms표만 주목
  • 4 필드만 집중
  • body: 문자 내용
  • address: 문자의 발송자나 수신자 번호
  • date: 문자시간
  • type:1은 수령, 2는 발송
  • 시스템 문자를 읽고 먼저 원본 코드를 조회하여 문자 데이터베이스 내용 제공자의 호스트 이름과 경로를 얻은 다음
    ContentResolver cr = getContentResolver();
    Cursor c = cr.query(Uri.parse("content://sms"), new String[]{"body", "date", "address", "type"}, null, null, null);
    while(c.moveToNext()){
        String body = c.getString(0);
        String date = c.getString(1);
        String address = c.getString(2);
        String type = c.getString(3);
        System.out.println(body+";" + date + ";" + address + ";" + type);
    }
    
  • 시스템 문자 삽입
    ContentResolver cr = getContentResolver();
    ContentValues cv = new ContentValues();
    cv.put("body", "    XXXX          1,000,000   ");
    cv.put("address", 95555);
    cv.put("type", 1);
    cv.put("date", System.currentTimeMillis());
    cr.insert(Uri.parse("content://sms"), cv);
    
  • 조회 시스템 문자를 삽입하려면 등록 권한이 필요합니다
  • 연락처 데이터베이스

  • raw_contacts 표:
  • contact_id: 연락처 id
  • 데이터 테이블: 연락처의 구체적인 정보, 한 정보가 한 줄을 차지한다.
  • 데이터1: 정보의 구체적인 내용
  • raw_contact_id: 연락처 id, 정보가 어느 연락처에 속하는지 설명
  • mimetype_id: 정보가 어떤 유형에 속하는지 설명
  • mimetypes 표:mimetype를 통해id 이 테이블에서 구체적인 유형 보기
  • 연락처 읽기

  • 먼저 raw 조회연락처 id
    Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
    
  • 가져오기
  • 그리고 연락처 id를 가지고 데이터 테이블에 가서 이 연락처에 속하는 정보를 조회한다
    Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{contactId}, null);
    
  • 데이터 1 필드의 값을 얻어 연락처의 정보를 mimetype을 통해 어떤 유형의 정보인지 판단
    while(c.moveToNext()){
        String data1 = c.getString(0);
        String mimetype = c.getString(1);
        if("vnd.android.cursor.item/email_v2".equals(mimetype)){
            contact.setEmail(data1);
        }
        else if("vnd.android.cursor.item/name".equals(mimetype)){
            contact.setName(data1);
        }
        else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
            contact.setPhone(data1);
        }
    }
    
  • 연락처 삽입

  • 먼저 raw 조회연락처표, 새로운 연락처의 id가 얼마인지 확인하기
  • 확인된 연락처 id를raw 에 삽입contacts표
    cv.put("contact_id", _id);
    cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), cv);
    
  • 데이터 테이블에 데이터 삽입
  • 3개 필드 삽입: 데이터1, mimetype,rawcontact_id
    cv = new ContentValues();
    cv.put("data1", "  ");
    cv.put("mimetype", "vnd.android.cursor.item/name");
    cv.put("raw_contact_id", _id);
    cr.insert(Uri.parse("content://com.android.contacts/data"), cv);
    
    cv = new ContentValues();
    cv.put("data1", "1596874");
    cv.put("mimetype", "vnd.android.cursor.item/phone_v2");
    cv.put("raw_contact_id", _id);
    cr.insert(Uri.parse("content://com.android.contacts/data"), cv);
    


  • 내용 관찰자

  • 데이터베이스 데이터가 바뀔 때 내용 제공자는 알림을 보내고 내용 제공자의uri에 내용 관찰자를 등록하면 데이터 변화에 대한 알림
    cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
    
    class MyObserver extends ContentObserver{
    
        public MyObserver(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }
    
        //                  ,      
        @Override
        public void onChange(boolean selfChange) {
    
        }
    
    }
    
  • 을 받을 수 있다.
  • 콘텐츠 제공자에 알림을 보내는 코드
    ContentResolver cr = getContext().getContentResolver();
    //    ,       uri              
    cr.notifyChange(uri, null);
  • 좋은 웹페이지 즐겨찾기