수색…


비고

컨텐츠 제공자는 구조화 된 데이터 세트에 대한 액세스를 관리합니다. 데이터를 캡슐화하고 데이터 보안을 정의하는 메커니즘을 제공합니다. 콘텐츠 공급자는 한 프로세스의 데이터를 다른 프로세스에서 실행되는 코드와 연결하는 표준 인터페이스입니다.

컨텐트 프로 바이더의 데이터에 액세스하려면 응용 프로그램의 Context 에서 ContentResolver 객체를 사용하여 프로 바이더와 클라이언트로 통신합니다. ContentResolver 객체는 공급자 객체 ( ContentProvider 를 구현하는 클래스의 인스턴스)와 통신합니다. 공급자 개체는 클라이언트에서 데이터 요청을 받고 요청한 작업을 수행 한 다음 결과를 반환합니다.

다른 응용 프로그램과 데이터를 공유하지 않으려는 경우 자체 공급자를 개발할 필요가 없습니다. 그러나 자신의 응용 프로그램에서 사용자 지정 검색 제안을 제공하려면 자체 공급자가 필요합니다. 복잡한 데이터 또는 파일을 응용 프로그램에서 다른 응용 프로그램으로 복사하여 붙여 넣으려면 자체 공급자가 필요합니다.

Android 자체에는 오디오, 비디오, 이미지 및 개인 연락처 정보와 같은 데이터를 관리하는 컨텐츠 공급자가 포함됩니다. android.provider 패키지의 참조 문서에 나열된 일부를 볼 수 있습니다. 몇 가지 제한 사항이 있지만 이러한 제공 업체는 모든 Android 애플리케이션에 액세스 할 수 있습니다.

기본 콘텐츠 공급자 클래스 구현

1) 계약 클래스 만들기

계약 클래스는 응용 프로그램이 컨텐트 URI, 열 이름, 의도 동작 및 컨텐트 공급자의 다른 기능을 다루는 데 도움이되는 상수를 정의합니다. 계약 클래스는 공급자에게 자동으로 포함되지 않습니다. 공급자의 개발자는 정의한 다음 다른 개발자가 사용할 수 있도록해야합니다.

제공자는 보통 하나의 권한을 가지며, 이는 Android 내부 이름으로 사용됩니다. 다른 공급자와의 충돌을 피하려면 고유 한 콘텐츠 권한을 사용하십시오. 이 권장 사항은 Android 패키지 이름에도 해당되기 때문에 공급자 권한을 공급자가 들어있는 패키지 이름의 확장으로 정의 할 수 있습니다. 예를 들어 Android 패키지 이름이 com.example.appname 경우 공급자에게 com.example.appname.provider 권한을 부여해야합니다.

public class MyContract {
    public static final String CONTENT_AUTHORITY = "com.example.myApp";
    public static final String PATH_DATATABLE = "dataTable";
    public static final String TABLE_NAME = "dataTable";
}

콘텐츠 URI는 공급자의 데이터를 식별하는 URI입니다. 컨텐츠 URI는 전체 제공자의 기호 이름 (권한)과 테이블 또는 파일 (경로)을 가리키는 이름을 포함합니다. 선택적 id 부분은 테이블의 개별 행을 가리 킵니다. ContentProvider의 모든 데이터 액세스 메소드에는 콘텐츠 URI가 인수로 있습니다. 이렇게하면 액세스 할 테이블, 행 또는 파일을 결정할 수 있습니다. 계약 클래스에서 이들을 정의하십시오.

public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_DATATABLE).build();

// define all columns of table and common functions required

2) 도우미 클래스 만들기

헬퍼 클래스는 데이터베이스 생성과 버전 관리를 관리합니다.

public class DatabaseHelper extends SQLiteOpenHelper {

    // Increment the version when there is a change in the structure of database
    public static final int DATABASE_VERSION = 1;
    // The name of the database in the filesystem, you can choose this to be anything
    public static final String DATABASE_NAME = "weather.db";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Called when the database is created for the first time. This is where the
        // creation of tables and the initial population of the tables should happen.
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Called when the database needs to be upgraded. The implementation
        // should use this method to drop tables, add tables, or do anything else it
        // needs to upgrade to the new schema version.
    }
}

3) ContentProvider 클래스를 확장하는 클래스 만들기

public class MyProvider extends ContentProvider {

public DatabaseHelper dbHelper;

public static final UriMatcher matcher = buildUriMatcher();
public static final int DATA_TABLE = 100;
public static final int DATA_TABLE_DATE = 101;

UriMatcher는 권한과 경로를 정수 값에 매핑합니다. match() 메서드는 URI에 대해 고유 한 정수 값을 반환합니다 (고유 한 경우 임의의 숫자가 될 수 있음). switch 문은 전체 테이블을 쿼리하고 단일 레코드를 쿼리하는 것 중에서 선택합니다. UriMatcher는 URI가 Table의 Content URI이고 URI가 해당 테이블의 특정 행을 가리키는 경우 101을 반환합니다. # 와일드 카드를 사용하여 임의의 숫자 및 * 와 일치시켜 모든 문자열과 일치시킬 수 있습니다.

public static UriMatcher buildUriMatcher() {
    UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(CONTENT_AUTHORITY, MyContract.PATH_DATATABLE,        DATA_TABLE);
    uriMatcher.addURI(CONTENT_AUTHORITY, MyContract.PATH_DATATABLE + "/#", DATA_TABLE_DATE);
    return uriMatcher;
}

중요 : addURI() 호출의 순서는 중요합니다! UriMatcher는 처음부터 끝까지 순서대로 보입니다. #* 와 같은 와일드 카드는 욕심이 많기 때문에 URI를 올바르게 주문했는지 확인해야합니다. 예 :

uriMatcher.addURI(CONTENT_AUTHORITY, "/example", 1);
uriMatcher.addURI(CONTENT_AUTHORITY, "/*",       2);

/* 일치에 의존하기 전에 정규 표현식이 먼저 /example 을 찾을 것이기 때문에 적절한 순서가있다. 이러한 메소드 호출이 취소되고 uriMatcher.match("/example") 를 호출하면 UriMatcher는 /* 경로를 만나고 잘못된 결과를 반환합니다!

다음 함수를 재정의해야합니다.

onCreate () : 공급자를 초기화합니다. Android 시스템은 제공자를 만든 직후이 메소드를 호출합니다. ContentResolver 객체가 공급자에 액세스하려고 시도 할 때까지 공급자가 생성되지 않습니다.

@Override
public boolean onCreate() {
    dbhelper = new DatabaseHelper(getContext());
    return true;
}

getType () : 내용 URI에 해당하는 MIME 유형을 반환합니다.

@Override
public String getType(Uri uri) {
    final int match = matcher.match(uri);
    switch (match) {
        case DATA_TABLE:
            return ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + MyContract.CONTENT_AUTHORITY + "/" + MyContract.PATH_DATATABLE;
        case DATA_TABLE_DATE:
            return ContentResolver.ANY_CURSOR_ITEM_TYPE + "/" + MyContract.CONTENT_AUTHORITY + "/" + MyContract.PATH_DATATABLE;
        default:
            throw new UnsupportedOperationException("Unknown Uri: " + uri);

    }
}

query () : 공급자로부터 데이터를 검색합니다. 인수를 사용하여 조회 할 테이블, 리턴 할 행과 열 및 결과의 정렬 순서를 선택하십시오. 데이터를 Cursor 객체로 반환합니다.

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    Cursor retCursor = dbHelper.getReadableDatabase().query(
        MyContract.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
    retCursor.setNotificationUri(getContext().getContentResolver(), uri);
    return retCursor;
}

공급자에게 새 행을 삽입하십시오. 인수를 사용하여 대상 테이블을 선택하고 사용할 열 값을 가져옵니다. 새롭게 삽입 된 행의 컨텐츠 URI를 돌려줍니다.

@Override
public Uri insert(Uri uri, ContentValues values)
{
    final SQLiteDatabase db = dbHelper.getWritableDatabase();
    long id = db.insert(MyContract.TABLE_NAME, null, values);
    return ContentUris.withAppendedId(MyContract.CONTENT_URI, ID);
}

delete () : 공급자에서 행을 삭제합니다. 인수를 사용하여 삭제할 테이블과 행을 선택하십시오. 삭제 된 행수를 돌려줍니다.

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    int rowsDeleted = db.delete(MyContract.TABLE_NAME, selection, selectionArgs);
    getContext().getContentResolver().notifyChange(uri, null);
    return rowsDeleted;
}

update () : 공급자의 기존 행을 업데이트합니다. 인수를 사용하여 업데이트 할 테이블과 행을 선택하고 새 열 값을 가져옵니다. 갱신 된 행수를 돌려줍니다.

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    int rowsUpdated = db.update(MyContract.TABLE_NAME, values, selection, selectionArgs);
    getContext().getContentResolver().notifyChange(uri, null);
    return rowsUpdated;
}

4) 매니페스트 파일 업데이트

<provider
        android:authorities="com.example.myApp"
        android:name=".DatabaseProvider"/>


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow