Android 초급 자습서 이론 지식(제4장 내용 제공자)

앞서 제3장 이론 지식은 데이터베이스에 쓴 적이 있다.데이터베이스는 프로그램 내부에서 스스로 자신을 방문하는 것이다.콘텐츠 공급자는 다른 프로그램 데이터에 접근하는 것, 즉 크로스 프로그램 공유 데이터다.액세스한 데이터는 CRUD에 불과합니다.
콘텐츠 공급자
응용된 데이터베이스는 다른 응용프로그램의 접근을 허용하지 않는다내용 제공자의 역할은 다른 응용 프로그램이 당신의 데이터베이스에 접근하도록 하는 것이다사용자 정의 콘텐츠 공급자를 쓰는 코드는 피방문 프로그램과 주 방문 프로그램 사이에서 코드를 번갈아 쓰는 것이다.
콘텐츠 공급자를 사용자 정의하고 ContentProvider 클래스를 계승하며 삭제 수정 방법을 다시 쓰고 방법에서 삭제 수정 데이터베이스 코드를 작성하며 예를 들어 추가 방법을 사용한다.Custom RetentProvider
@Override
public Uri insert(Uri uri, ContentValues values) {
    db.insert("person", null, values);
    return uri;
}
명세서 파일에서 내용 공급자의 라벨을 정의할 때 authorities 속성이 있어야 합니다. 이것은 내용 공급자의 호스트 이름이고 기능이 유사한 주소
<provider android:name="com.it.contentprovider.PersonProvider"
    android:authorities="com.it.person"
    android:exported="true"
 ></provider>
입니다.
다른 응용 프로그램을 만들고 사용자 정의 내용 공급자에 접근하여 데이터베이스에 대한 삽입 작업을 실현한다
public void click(View v){
    //         
    ContentResolver cr = getContentResolver();//    ContentResolver
    ContentValues cv = new ContentValues();
    cv.put("name", "  ");
    cv.put("phone", 138856);
    cv.put("money", 3000);
    //url:         ,   uri           
    cr.insert(Uri.parse("content://com.it.person"), cv);
}
UriMatcher
한 개의 ui가 지정한 여러 개의 ui 중 어느 것과 일치하는지 판단하는 데 사용합니다일치 규칙 추가
//    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);//   long  ,    int
문자 데이터베이스
sms표만 주목하면 됩니다.
네 필드만 주목하면 됩니다.
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 이 테이블에서 구체적인 유형 보기 연락처 읽기
먼저 라우 조회하기연락처 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);
    }
}
연락처 삽입
먼저 라우 조회하기연락처표, 새로운 연락처의 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);

좋은 웹페이지 즐겨찾기